我在MVC中有以下模型:
public class IndexViewModel
{
public SubViewModel SubViewModel { get; set; }
}
在我的索引视图中,我正在执行以下操作以显示SubViewModel
的编辑器:
Index.cshtml
@model IndexViewModel
@Html.EditorFor(m => m.SubViewModel)
在我的SubViewModel.cshtml
文件中,我尝试执行以下操作:
EditorTemplates / SubViewModel.cshtml
@model SubViewModel
@Html.EditorForModel("SubViewModelForm")
基本上,我想把我的编辑分成两部分。第一个编辑器模板将创建表单,而内部模板将创建所有实际表单字段。问题是内部视图永远不会被渲染。
就像MVC意识到我已经在该模型上调用了EditorFor并阻止我再次这样做。我有办法让这个工作吗?
修改
我以为我清楚地输出了发生的事情,但我猜不是。
我想使用两个模板来显示单个模型。在第一个模板中,我想渲染表单和提交按钮,以及一些容器div。
在第二个模板中,我想渲染所有表单字段。
Index.cshtml @ Html.EditorFor(m => m.SubViewModel) - >渲染表单和容器
SubViewModel.cshtml @ Html.EditorForModel(“SubViewModelForm”) - >渲染表单字段
问题是第二次调用(@ Html.EditorForModel(“SubViewModelForm”))似乎没有做任何事情。它根本不会呈现任何标签。它被MVC忽略了。
我想这样做的原因是因为我将使用ajax调用发布此表单。如果一切正常(模型状态有效),那么我想将JSON数据返回到视图。如果模型无效,我想只返回表单字段的局部视图。这样我就不需要再次连接所有的事件处理程序了。我只能替换表单字段而不是整个视图。
答案 0 :(得分:5)
我认为这与TemplateInfo.Visited方法有关。简单地说,你不能对同一个对象使用EditorFor
两次。这就是为什么mvc忽略了你的第二个EditorForModel,因为SubViewModel的编辑器已经被渲染(来自Index.cshtml)。
我不知道这是否是最好的解决方法,但首先想到的是通过调用Html.Partial
将第二个模板渲染为部分视图@model SubViewModel
@Html.Partial("SubViewModelForm", Model)
答案 1 :(得分:1)
阅读完其他详细信息后,我认为最好使用容器模板模板。
/* Container.cshtml (container markup and call to editor template) */
<fieldset>
@Html.EditorForModel()
</fieldset>
/* SubViewModel.cshtml editor template */
@model SubViewModel
@Html.DisplayFor(x => x.Property1)
@Html.EditorFor(x => x.Property1)
...
/* Index.cshtml */
@Html.RenderPartial("Container.cshtml", Model.SubViewModel)