【问题标题】:MVC 4 reuse views and view models best practiceMVC 4 重用视图和视图模型最佳实践
【发布时间】:2014-02-07 15:54:15
【问题描述】:

我有 3 个屏幕共享一个部分(其中包含模型数据(@Html.TextBoxFor))。实现此屏幕的最佳方式是什么?

我尝试了什么:

1) 公共部分(_ClientData)的部分视图。不同屏幕的 3 个视图。 3个具有共同属性(ClientData)的视图模型,即部分视图模型。 问题:如果我将模型作为@{Html.RenderPartial("_ClientData", Model.ClientData);} 传递给部分,则部分中的数据不会提交给模型。 如果我将模型作为 @{Html.RenderPartial("_ClientData", Model);} 传递给局部视图并使用填充名称引用属性,则提交数据,但我无法将不同类型的模型传递给局部视图。

2) 使用一个大视图模型,其中包含 3 个屏幕所需的所有数据,一个视图并根据某些标志显示/隐藏一些元素。 问题:我无法使用 ValidationAttributes(例如,如果屏幕 1 中需要一个字段,但屏幕 2 中未显示该字段且其值为 null,则将触发验证)。我可以在控制器中使用一些手动验证,但使用多合一视图和视图模型的整个过程听起来很糟糕。

【问题讨论】:

  • 对于#1(如果我理解正确的话),让所有 3 个模型实现相同的接口,以便您可以将它们中的每一个传递到相同的局部视图,例如IHaveClientData。然后视图可以期待IHaveClientData 的实例。
  • 我会试试的,谢谢。

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


【解决方案1】:

如果您想将它们放在一个表单中并一起提交,那么部分通常不是最佳选择。在这种情况下,最好利用EditorTemplates 来解决您的问题。

首先,您必须将您的部分拖到文件夹~/Shared/EditorTemplates/ 并重命名它们以匹配模型名称。

然后你可以像这样在你的视图中调用它们:

Html.EditorFor(model => model.ClientData)

因此,您的 HTML 代码(准确地说是 name 属性)将以这样一种方式生成,即您的默认模型绑定器也将能够绑定您视图的这一部分。

【讨论】:

  • 谢谢,我会用的。
猜你喜欢
  • 2011-09-16
  • 2011-04-08
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
相关资源
最近更新 更多