我的示例MVC 3应用程序SimpleModel
和ComplexModel
中有2个模型,如下所示:
public class SimpleModel
{
public string Status { get; set; }
}
public class ComplexModel
{
public ComplexModel()
{
Simple = new SimpleModel();
}
public SimpleModel Simple{ get; set; }
}
我为这个模型定义了视图:
_SimplePartial.cshtml
:
@model SimpleModel
@Html.LabelFor(model => model.Status)
@Html.EditorFor(model => model.Status)
和Complex.cshtml
:
@model ComplexModel
@using (Html.BeginForm()) {
@Html.Partial("_SimplePartial", Model.Simple)
<input type="submit" value="Save" />
}
提交表单后,在Status
字段中输入随机值,该值不会绑定到我的模型。当我在控制器操作中检查模型时,Status
字段为NULL
:
[HttpPost]
public ActionResult Complex(ComplexModel model)
{
// model.Simple.Status is NULL, why ?
}
为什么没有绑定?我不想继承模特。我是否必须为这种简单的情况编写自定义模型粘合剂?
问候。
答案 0 :(得分:60)
而不是:
@Html.Partial("_SimplePartial", Model.Simple)
我建议您使用编辑器模板:
@model ComplexModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Simple)
<input type="submit" value="Save" />
}
然后将简单部分放在~/Views/Shared/EditorTemplates/SimpleModel.cshtml
内或~/Views/Home/EditorTemplates/SimpleModel.cshtml
内,其中Home
是控制器的名称:
@model SimpleModel
@Html.LabelFor(model => model.Status)
@Html.EditorFor(model => model.Status)
当然,如果您希望部分位于某个特殊位置而不遵循惯例(为什么会这样?),您可以指定位置:
@Html.EditorFor(x => x.Simple, "~/Views/SomeUnexpectedLocation/_SimplePartial.cshtml")
然后一切都会按预期到位。
答案 1 :(得分:25)
As Daniel Hall suggests in his blog,将ViewDataDictionary
传递给TemplateInfo
,其中HtmlFieldPrefix
设置为SimpleModel属性的名称:
@Html.Partial("_SimplePartial", Model.Simple, new ViewDataDictionary(ViewData)
{
TemplateInfo = new System.Web.Mvc.TemplateInfo
{
HtmlFieldPrefix = "Simple"
}
})