在mvc4中创建通用mvc视图

时间:2013-07-10 07:48:15

标签: c# asp.net-mvc-4 generics

我之前提出过类似的问题,没有答案。

如何创建可以显示传递给它的列表或单个模型的通用mvc4视图。模型可以是人或组织或派对,无论传递给它的是什么。

4 个答案:

答案 0 :(得分:7)

如果你正在寻找类似的东西:

@model MyViewModel<T> where T : IViewModel

...然后Razor不支持。

您可以使用以下内容:

@model MyViewModel<IViewModel>

...这样你就可以定义所有可以传递的类型,如下所示

public class Person : IViewModel { ... }
public class Organisation : IViewModel { ... }
public class Party : IViewModel { ... }

答案 1 :(得分:4)

拜托,请不要这样做!

您应该为每种对象/对象列表创建一个视图。

然而,yu仍然可以重用元素:

  • 在网站布局上保留公共部分(菜单,页眉,页脚...)
  • 为每种对象制作视图
  • 查看每种列表。在此视图中,您可以将对象的视图用作局部视图,并将其呈现为列表中对象的多次。

另一种可能性是为每种对象制作“Display For”模板。您可以为每种对象定义视图,并将其存储在特殊文件夹中。在模板中使用Html.DisplayHtml.DisplayFor时,系统将根据要显示的对象的类型选择并呈现正确的模板。 (您也可以创建命名模板,并按名称选择它们)。有关此技术的介绍,look at this excellent posts by Brad Wilson

但我坚持,请不要制作“通用视图”,因为这会增加额外的复杂性(检查它是列表还是简单对象,获取对象的类型,选择如何显示和显示它)。您可以通过重复使用所解释的元素来制作非常简单的视图,并让控制器决定为每个对象或对象列表显示哪个视图。或者使用模板。通过这种方式,您的系统将更容易维护,并且由于增加了复杂性而不易出错(您不需要一直更改相同的模板,而是添加新模板,只需很少的代码)

我无法理解为什么你想要一个简单的视图。这是什么原因?

答案 2 :(得分:1)

@model MyViewModel<IViewModel>

如果您定义这样的模型,则会发生以下错误:

  应用程序中的服务器错误。

传递到字典中的模型项的类型为MyViewModel\'1[Person],但此字典需要类型为MyViewModel'1[IViewModel]的模型项。

答案 3 :(得分:1)

获得通用视图使用以下代码。动态是可以接受任何模型的内置关键字。对我来说效果很好

@model dynamic 要么 @model IEnumerable<dynamic>