C# 如何从常规列表创建视图?

C# 如何从常规列表创建视图?,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个通用列表,我想创建一个视图来迭代列表并输出结果 我遇到了几个问题: 我不知道如何让我的view.aspx理解t 我不知道如何让它为t渲染正确的部分 例如,如果我传入一个CustomObject1列表,那么我想呈现部分CustomObject1.ascx,如果传入一个CustomObject2列表,那么我想呈现部分CustomObject2.ascx 有没有一个我忽略的简单方法?我不想对我想使用的每种类型的列表都使用不同的aspx,毕竟我只是生成了一系列的项目。因此,有15种不同的视图

我有一个通用列表,我想创建一个视图来迭代列表并输出结果

我遇到了几个问题:

  • 我不知道如何让我的view.aspx理解t
  • 我不知道如何让它为t渲染正确的部分
例如,如果我传入一个CustomObject1列表,那么我想呈现部分CustomObject1.ascx,如果传入一个CustomObject2列表,那么我想呈现部分CustomObject2.ascx

有没有一个我忽略的简单方法?我不想对我想使用的每种类型的列表都使用不同的aspx,毕竟我只是生成了一系列的项目。因此,有15种不同的视图来涵盖我将要使用的每种类型的列表是一种浪费


如果您有任何想法或解决方案,我们将不胜感激。

我觉得您首先需要使用一个所有CustomObjects都通用的界面。然后,您的视图将基于
列表

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

我可以想到两种方法

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

如果您的名称始终匹配(CustomObject1,然后我要呈现部分CustomObject1.ascx),那么您可以使用类型名称。因此:

void MyMethod(List<T> items)
{
    foreach(T item in items)
    {
        Html.RenderPartial(item.GetType().Name, item);
    }
}
void MyMethod(列表项)
{
foreach(项目中的T项目)
{
RenderPartial(item.GetType().Name,item);
}
}

Anthony第一个答案的示例:让列表内容负责呈现自己,例如

interface IHtmlRenderable
{
    void RenderHtml();
}

void MyMethod(List<T> items) //where T implements IHtmlRenderable
{
    foreach(T item in items) ((IHtmlRenderable)item).RenderHtml();
}
接口IHTMLRendeable
{
void RenderHtml();
}
void MyMethod(列表项)//其中T实现IHTMLRendeable
{
foreach(items中的T项)((IHtmlRenderable)item.RenderHtml();
}
但是John的答案似乎更清晰,因为您不需要在每个类上实现这个接口,也不需要添加属性等等