在我的ASP.NET MVC项目中,我有一个我希望呈现的多态集合 - 比如IEnumerable<ISomething>
,其中各个项可能是ISomething
的不同实现的混合。
我想要呈现该列表,其中每个具体类型根据其自己的模板(可能是强类型的ViewUserControl)呈现。
在WPF中,我能够指定将自动将具体类型绑定到特定模板的DataTemplates。我可以在ASP.NET MVC中做类似的事情吗?
显然,我可以遍历列表并尝试使用is
关键字进行转换,然后使用大量if
语句来呈现所需的控件,但我希望有更优雅的东西(像WPF)。
答案 0 :(得分:1)
我最终自己开发了一个解决方案 - 我在DataTemplating In ASP.NET MVC中对其进行了描述。
答案 1 :(得分:0)
我不确定我是否让你完全,但是,为什么不为你的ISomething界面实现一个方法,例如渲染,通过契约将实现到所有其他具体实体,然后迭代通过多态集合中的每个项目并调用它。
答案 2 :(得分: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 { /* ... */ }
然后,正如我所说,我使用Umbrella项目从ISomething转换为ISomethingDecorator并将IEnumerable返回到View。
不知道它是否会帮助你做你想做的事情 - 尤其是迟到一个月 - 但我想我会告诉你我是如何处理它的。如果你正在显示完全不同的格式,它可能不会起作用,但也许它可以为你提供一个起点。