在POST回我的控制器时,是否必须将部分视图的数据重新分配给模型?

时间:2009-12-16 14:58:22

标签: c# asp.net-mvc

新手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的单独参数?

3 个答案:

答案 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