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

3
我有一个通用的列表 List<T>,我想创建一个视图来迭代这个列表并输出内容。
我遇到了几个问题:
- 我不知道如何让我的view.aspx理解T。 - 我不知道如何渲染正确的T部分。 比如,如果我传递一个CustomObject1的列表,那么我希望呈现partial CustomObject1.ascx,如果我传递一个CustomObject2的列表,则我希望呈现partial CustomObject2.ascx。
有没有简单的方法可以做到这一点,我可能忽略了什么?我不想为每种类型的列表都有一个不同的aspx,毕竟我只是生成一组项目。因此,需要15个不同的视图来覆盖我需要使用的每种类型的列表并不划算。
任何想法或解决方案都将不胜感激。
3个回答

2
如果名称总是匹配的(例如CustomObject1),那么您可以使用该类型名称来呈现部分视图CustomObject1.ascx。因此,代码如下所示:
void MyMethod(List<T> items)
{
    foreach(T item in items)
    {
        Html.RenderPartial(item.GetType().Name, item);
    }
}

2
安东尼的第一个答案示例:通过使列表内容对自身进行渲染来实现响应式设计,例如。
interface IHtmlRenderable
{
    void RenderHtml();
}

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

但是约翰的答案似乎更简洁,因为您不需要在每个类上实现此接口,或添加属性等。

1

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

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

我可以想到两种方法:

  • 让ICommonInterface公开一个属性来指定要使用的自定义控件。这种方法简单,但在某种程度上感觉有些错误和不洁。
  • 创建一个Attribute类,可用于装饰CustomObject类,此Attribute指定要使用的自定义控件。这种方法更复杂,因为它需要一些反射来发现属性的值,但在某种程度上感觉正确和干净。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接