新手ASP.NET MVC问题:
我有以下型号:
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
}
以下客户观点:
<% using (Html.BeginForm()) { %>
First Name: <%=Html.TextBox("FirstName") %>
Last Name: <%=Html.TextBox("LastName") %>
<% Html.RenderPartial("AddressView", Model.Address); %>
<input type="submit" name="btnSubmit" value="Submit"/>
<%} %>
以下是地址的部分视图:
<%=Html.DropDownList("CountryId", new SelectList(Country.GetAll(), "Id", "Name") })%>
<%=Html.DropDownList("CountrySubdivisionId", new SelectList(CountrySubDivision.GetByCountryId(Model.CountryId), "Id", "Name"))%>
以下控制器操作:
[AcceptVerbs(HttpVerbs.Post)]
public ViewResult Index(Customer customer, Address address)
{
customer.Address = address;
ViewData.Model = customer;
return View();
}
我希望该操作适用于1个参数:customer,并且我不必手动重新分配customer.Address。但是,执行操作时,Customer.Address为空。
我是否错误地使用了模型绑定,或者我的操作是否需要针对Customer和Address的单独参数?
答案 0 :(得分:2)
它应该绑定到客户,因为客户定义了地址属性类型(地址)。 您的地址部分视图应定义名称,如
//Here the Model refers to Model.Address in the PartialView
<%=Html.TextBox("Address.property1", Model.property1) %>
这样,ModelBinder知道地址属性应绑定到客户对象的Address属性部分。
编辑:为元素名称添加地址:
<%=Html.DropDownList("Address.CountryId", new SelectList(Country.GetAll(), "Id", "Name") })%>
<%=Html.DropDownList("Address.CountrySubdivisionId", new SelectList(CountrySubDivision.GetByCountryId(Model.CountryId), "Id", "Name"))%>
答案 1 :(得分:2)
POST
操作根本不了解视图。它不知道或不关心涉及部分视图。
它看到的仅事物是POSTed HTML表单。你可以在Firebug或Fiddler中看到这个。因此,如果表单具有正确的键名和值,则Customer
操作只能有一个POST
参数。
关于这一点有很多规则,但你的问题的答案是,你使用局部视图的事实对模型绑定到POST没有任何影响。唯一重要的是表格的内容。
答案 2 :(得分:2)
使用Html.EditorFor代替Html.RenderPartial。
请参阅Model binding with nested child models and PartialViews in ASP.NET MVC。