【问题标题】:MVC4 using same partial view in multiple viewsMVC4 在多个视图中使用相同的局部视图
【发布时间】:2015-03-26 20:31:17
【问题描述】:

我有一个“注册申请”视图,包含 20 个字段。用户注册。用户注册后,我可以选择让用户更新已提交的组件。

例如:查看注册有“联系信息”、“地址信息”等部分,目前有 5 个部分。

所以在注册视图中,我创建了一个包含所有字段的视图模型@model ViewModels.RegisterVM

对于编辑联系信息,我有自己的@model ViewModels.ContactInformationVM

现在,这是我的问题,因为两个视图将具有相同的标记代码,所以我决定为联系信息创建一个部分视图,以便我可以重用标记代码,并且能够在一个地方而不是两个地方管理它。

所以在注册视图中

 @model ViewModels.RegisterVM
  .......
 @Html.Partial("~/Views/Shared/widget/_ContactInformation.cshtml", @Model)

在联系信息视图中我想重用这个局部视图

 @model ViewModels.ContactInformationVM` 
 @Html.Partial("~/Views/Shared/widget/_ContactInformation.cshtml", @Model)

两个视图都有自己的视图模型,局部视图只能接受一个视图模型

不知道我应该在局部视图中声明什么视图模型

我知道我可以从部分视图中复制代码并将其放置在注册视图和联系信息视图中,这样可以解决问题。但我想知道是否有更好的方法来避免使用相同的代码在多个文件中。

我希望我的要求是有道理的。谢谢阅读。

【问题讨论】:

  • 我强烈建议使用 ajax 调用将部分放在视图上。在这里查看我的答案stackoverflow.com/questions/18847735/…
  • 如果我正确理解了这个问题,那么我很困惑。视图模型用于支持视图。如果您使用相同的 [部分] 视图,那么它们应该使用相同的视图模型。请记住,视图模型不是域模型——如果它们具有相同的数据,那么它们很可能是相同的模型;它们没有像域对象那样的语义差异。将模型重命名为 ContactInformation 并使用它。
  • @MattBodily:通过 AJAX 提取部分内容如何解决这里的问题?
  • @ChrisPratt 执行 ajax 调用以加载局部视图比更改每个视图上的视图模型并尝试传递该信息要简单得多。反正在我看来

标签: asp.net-mvc-4 model-view-controller partial-views


【解决方案1】:

您在这里要做的是创建一个复合视图模型,该模型将每个部分作为单独的属性。例如:

public class RegisterVM
{
    public ContactInformationVM ContactInformation { get; set; }
    public AddressInformationVM AddressInformation { get; set; }
    ...
}

然后在您的部分中,您引用子模型:

_ContactInformation.cshtml

@model ViewModels.ContactInformationVM

<!-- contact info fields here, for example: -->
@Html.EditorFor(m => m.FirstName)
...

然后,在您的注册视图中,您使用 RegisterVM 作为您的模型并为每个部分加载部分:

@model ViewModels.RegisterVM

@Html.Partial("_ContactInformation", Model.ContactInformation)
@Html.Partial("_AddressInformation", Model.AddressInformation)
...

现在,您可以随意重用这些组件。

【讨论】:

  • 谢谢克里斯。当我使用您提供的代码时,我在添加 @Html.Partial("_ContactInformation", Model.ContactInformation) 运行时错误的地方收到一条错误消息:对象引用未设置为对象的实例。你知道为什么吗?
猜你喜欢
  • 2013-03-29
  • 2013-05-17
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多