ASP.net MVC - 使用相同模型类型的EditorFor两次

Dis*_*ile 2 .net asp.net-mvc mvc-editor-templates

我在MVC中有以下模型:

public class IndexViewModel
{
    public SubViewModel SubViewModel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在我的索引视图中,我正在执行以下操作以显示编辑器SubViewModel:

Index.cshtml

@model IndexViewModel

@Html.EditorFor(m => m.SubViewModel)
Run Code Online (Sandbox Code Playgroud)

在我的SubViewModel.cshtml文件中,我尝试执行以下操作:

EditorTemplates/SubViewModel.cshtml

@model SubViewModel

@Html.EditorForModel("SubViewModelForm")
Run Code Online (Sandbox Code Playgroud)

基本上,我想把我的编辑分成两部分.第一个编辑器模板将创建表单,而内部模板将创建所有实际表单字段.问题是内部视图永远不会被渲染.

这就像MVC意识到我已经在该模型上调用了EditorFor并阻止我再次这样做.我有办法让这个工作吗?

编辑

我以为我清楚地输出了发生的事情,但我猜不是.

我想使用两个模板来显示单个模型.在第一个模板中,我想渲染表单和提交按钮,以及一些容器div.

在第二个模板中,我想渲染所有表单域.

Index.cshtml @ Html.EditorFor(m => m.SubViewModel) - >渲染表单和容器

SubViewModel.cshtml @ Html.EditorForModel("SubViewModelForm") - >呈现表单字段

问题是第二次调用(@ Html.EditorForModel("SubViewModelForm"))似乎没有做任何事情.它根本不会呈现任何标签.它被MVC忽略了.

我想这样做的原因是因为我将使用ajax调用发布此表单.如果一切正常(模型状态有效),那么我想将JSON数据返回到视图.如果模型无效,我想只返回表单字段的局部视图.这样我就不需要再次连接所有的事件处理程序了.我只能替换表单字段而不是整个视图.

arc*_*hil 5

我相信这与TemplateInfo.Visited方法有关.简单地说,你不能EditorFor对同一个对象使用两次.这就是为什么mvc忽略了你的第二个EditorForModel,因为SubViewModel的编辑器已经被渲染(来自Index.cshtml).

我不知道这是否是最好的解决方法,但首先要想到的是通过调用Html.Partial将第二个模板渲染为局部视图

@model SubViewModel

@Html.Partial("SubViewModelForm", Model)
Run Code Online (Sandbox Code Playgroud)