所以我想创建一个可重用的视图来编辑地址,电话号码等.
我设置了一个包含所有需要的模型的容器模型.
创建部分视图来处理地址部分
e形式
但是当它返回到控制器时,客户数据就在主页面,但部分视图中的任何内容都不存在(使用MVC4 / Razor)
集装箱模型
public class Customerviewmodel { public Customer CustomerData { get; set; } public Address MainAddress { get; set; } public Address ShippingAddress { get; set; } public Phone MainPhone { get; set; } public Phone Fax { get; set; } }
控制器:
public ActionResult Edit(int id = 0) { Customerviewmodel model = new Customerviewmodel(); model.CustomerData = Customer.FetchById(id); if (model.CustomerData == null) return HttpNotFound(); //... load addresses,phones return View(model); } [HttpPost] public ActionResult Edit(Customerviewmodel model) { if (ModelState.IsValid) { ///... save everything here - model has CustomerData,but nothing else } return View(model); }
主视图:
@model ProjectName.WebSite.Models.Customerviewmodel ..... @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>Customer</legend> @Html.HiddenFor(model => model.ModelCustomer.CustomerId) <div class="editor-label"> @Html.LabelFor(model => model.ModelCustomer.CompanyName) </div> <div class="editor-field"> @Html.EditorFor(model => model.ModelCustomer.CompanyName) @Html.ValidationMessageFor(model => model.ModelCustomer.CompanyName) </div> ... @Html.Partial("Address",Model.MainAddress,new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Main" } }) ... <p> <input type="submit" value="Save" /> </p> </fieldset> } .....
地址部分视图:
@model ProjectName.Business.Address <fieldset style="margin-top: 20px;"> <legend>@(ViewData["label"] ?? "Address")</legend> @Html.HiddenFor(model => model.AddressId) <div class="editor-label"> @Html.LabelFor(model => model.Street) </div> <div class="editor-field"> @Html.EditorFor(model => model.Street) @Html.ValidationMessageFor(model => model.Street) </div> ... </fieldset>
我在这里做错了什么 – 为什么我不能从部分视图中获取模型?
解决方法
解决了!我想到了!睡不着,只是绊倒了!
在视图中,您必须确保HtmlFieldPrefix使用与您的组合模型类中相同的名称,因此,由于我将两个地址命名为“MainAddress”和“ShippingAddress” – 只需确保在设置时使用相同的名称部分:
@Html.Partial("Address",new ViewDataDictionary(Html.ViewDataContainer.ViewData) { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "MainAddress" } }) @Html.Partial("Address",Model.ShippingAddress,new ViewDataDictionary(Html.ViewDataContainer.ViewData) { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "ShippingAddress" } })