复杂模型和部分视图 - ASP.NET MVC 3中的模型绑定问题

时间:2011-03-04 17:19:11

标签: c# asp.net-mvc-3 razor

我的示例MVC 3应用程序SimpleModelComplexModel中有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 ?
}

为什么没有绑定?我不想继承模特。我是否必须为这种简单的情况编写自定义模型粘合剂?

问候。

2 个答案:

答案 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"
        }
    })