2009-06-24 47 views
2

在我的ASP.NET MVC項目中,我有一個多態集合,我希望呈現 - 例如,IEnumerable<ISomething>,其中各個項目可能是ISomething的不同實現的混合。ASP.NET MVC有什麼等同於WPF的DataTemplate特性嗎?

我想那個列表呈現,其中每個具體類型根據自己的模板呈現(也許是一個強類型的ViewUserControl)。

在WPF中,我將能夠指定DataTemplates,它會自動將具體類型綁定到特定模板。我可以在ASP.NET MVC中做類似的事嗎?很顯然,我可以迭代整個列表並嘗試使用關鍵字is進行強制轉換,然後使用大量的if語句來呈現所需的控件,但我希望獲得更優雅的東西(如WPF)。

回答

0

我不確定如果我完全得到你,但是,爲什麼不實施一個方法到你的ISomething接口,比如渲染,例如,通過契約將實現到所有其他具體實體,然後迭代多態集合中的每個項目並調用它。

+0

因爲這將意味着特定於UI的代碼侵入了ISomething接口。然而,你的建議有一定的優勢,我可以定義一個新的接口來封裝對象,併爲每個對象定義一個視圖模型,以及相關的視圖標識符(就像你建議的方法一樣)。這可能有用,但與WPF的做法相比,仍然有點笨拙。 – 2009-06-24 12:29:49

0

我有一個類似的問題,從來沒有找到一個「簡單」的答案。我知道列表中的所有項目都會以相同的方式呈現,所以我爲ISomething創建了一個裝飾器,並使用Umbrella項目(http://umbrella.codeplex.com)中的一些代碼將列表轉換爲IEnumerable,然後提取出相關的部分。有點像下面:

public interface ISomethingDecorator 
{ 
    string Description { get; } 
    string[] Actions { get; } 
} 

public class BigSomethingDecorator : ISomethingDecorator { /* ... */ } 
public class SmallSomethingDecorator : ISomethingDecorator { /* ... */ } 

然後,正如我所說,我用傘項目從ISomething到ISomethingDecorator轉換並返回的IEnumerable的視圖。

不知道它是否會幫助你做你想做的事 - 特別是晚了一個月 - 但我想我會讓你知道我是如何處理它的。如果你顯示的是完全不同的格式,它可能不會做到這一點,但也許它可以爲你提供一個起點。

相關問題