2

我在 MVC 中有以下模型:

public class IndexViewModel
{
    public SubViewModel SubViewModel { get; set; }
}

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

索引.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 数据返回到视图。如果模型无效,我想只返回带有表单字段的部分视图。这样我就不需要再次连接我所有的事件处理程序。我可以只替换表单字段而不是整个视图。

4

2 回答 2

5

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

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

@model SubViewModel

@Html.Partial("SubViewModelForm", Model)
于 2011-12-06T15:57:09.677 回答
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)
于 2011-12-06T15:28:35.097 回答