2

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

如何创建可以显示传递给它的列表或单个模型的通用 mvc4 视图。model 可以是 Person 或 Organization 或 Party 传递给它的任何东西。

4

4 回答 4

7

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

@model MyViewModel<T> where T : IViewModel

...那么 Razor 不支持。

你也许可以使用这样的东西:

@model MyViewModel<IViewModel>

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

public class Person : IViewModel { ... }
public class Organisation : IViewModel { ... }
public class Party : IViewModel { ... }
于 2013-07-10T08:07:29.237 回答
4

请不要那样做!!

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

但是,yu 仍然可以重用元素:

  • 在网站布局上保留公共部分(菜单、页眉、页脚...)
  • 为每种对象制作一个视图
  • 为每种列表创建一个视图。在此视图中,您可以将对象的视图用作局部视图,并按照对象在列表中的次数对其进行渲染。

另一种可能性是为每种对象制作“Display For”模板。您可以为每种对象定义一个视图,并将其存储在一个特殊的文件夹中。当您使用Html.DisplayHtml.DisplayFor在您的模板中时,系统将根据要显示的对象的类型选择并渲染正确的模板。(您也可以制作命名模板,并按名称选择它们)。有关此技术的介绍,请查看 Brad Wilson 的这篇优秀文章

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

我不明白的是为什么你想要一个简单的观点。这是什么原因?

于 2013-07-10T10:52:07.253 回答
1
@model MyViewModel<IViewModel>

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

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


传入字典的模型项是 type MyViewModel\'1[Person],但是这个字典需要一个 type 的模型项MyViewModel'1[IViewModel]

于 2015-09-14T12:27:15.823 回答
1

实现通用视图使用下面的代码。dynamic 是一个内置关键字,可以接受任何模型。对我来说效果很好

@model dynamic 或者 @model IEnumerable<dynamic>

于 2020-03-31T11:12:35.597 回答