如何将数据模型传递给部分视图?

Pet*_*ter 2 asp.net-mvc razor

为了说明我面临的问题,我将三个简单的数据模型放在一起:

 public class PersonalModel {
     public string FirstName { get; set; }
     public string LastName { get; set; }
 }

 public class AddressModel {
     public string Street { get; set; }
 }

 public class OverallModel {
    public string Id { get; set; }
    public PersonalModel Personal { get; set; }
    public AddressModel Address { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

这是我简单的Index.chtml:

@model WebAppTest.Models.OverallModel
@using (Html.BeginForm())
{
  @Html.AntiForgeryToken()

  <div class="form-horizontal">
    <h4>OverallModel</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.Id)

    <div>
        @Html.Partial("Personal", Model.Personal)
    </div>
    <div>
        @Html.Partial("Address", Model.Address)
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div>
  </div>
}
Run Code Online (Sandbox Code Playgroud)

单击"保存"按钮时,将调用以下控制器方法:

[HttpPost]
public ActionResult Index(OverallModel model) {
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,model.Personalmodel.Address值始终显示在控制器的方法为空.

虽然这些值正确地传递给局部视图,但是当单击提交时,Razor引擎无法将整个对象重新组合在一起.

如果你能告诉我我失踪的是什么,我将不胜感激.问候.

小智 9

传递OverallModel给您的部分,以便正确命名控件以便回发OverallModel.目前你会有控件,name="FirstName"但他们需要name="Personal.FirstName"

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

并改变部分以适应

@model OverallModel
....
@Html.TextBoxFor(m => m.Personal.FirstName)
Run Code Online (Sandbox Code Playgroud)

作为替代方案,您也可以将前缀传递给partial

@Html.Partial("Address", Model.Personal, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "Personal" }})
Run Code Online (Sandbox Code Playgroud)