如何从通用列表创建视图?

时间:2009-10-10 17:43:38

标签: c# asp.net-mvc

我有一个通用列表List< T>我想创建一个迭代列表并吐出输出的视图。

我遇到了几个问题:

  • 我不知道如何让我的view.aspx了解T
  • 我不知道如何让它为T
  • 呈现正确的部分

例如,如果我传入一个CustomObject1列表,那么我想渲染部分CustomObject1.ascx,如果我传入一个CustomObject2列表,我想渲染部分CustomObject2.ascx。

有一种简单的方法可以做到这一点我忽略了吗?我不想为我想要使用的每种类型的列表都有不同的aspx,我只是生成一个项目。因此,有15个不同的视图来覆盖我将需要使用的每种类型的列表是浪费。

任何想法或解决方案都会感激不尽。

3 个答案:

答案 0 :(得分:2)

如果你的名字总是匹配(自定义对象1然后我想渲染部分自定义对象1.ascx),那么你可以使用类型名称。所以:

void MyMethod(List<T> items)
{
    foreach(T item in items)
    {
        Html.RenderPartial(item.GetType().Name, item);
    }
}

答案 1 :(得分:2)

Anthony的第一个答案示例:使列表内容负责通过例如自我渲染。

interface IHtmlRenderable
{
    void RenderHtml();
}

void MyMethod(List<T> items) //where T implements IHtmlRenderable
{
    foreach(T item in items) ((IHtmlRenderable)item).RenderHtml();
}

但John的回答似乎更清晰,因为您不需要花费精力在每个类上实现此接口 - 或添加属性等。

答案 2 :(得分:1)

听起来我首先需要使用一个对所有CustomObject都通用的接口。您的视图将基于List<IMyCommonInterface>

至于包含正确的ascx,我不确定通用系统是如何解决这个问题的。

我能想到两种方法。

  • 让ICommonInterface公开一个属性,指定要使用的自定义控件。简单,但不知何故感觉都错了,很脏。
  • 创建可用于装饰CustomObject类的Attribute类,此属性指定要使用的自定义控件。更复杂,因为它需要一点反思来发现属性的价值,但不知何故感觉正确和干净。