Должен ли я переназначать данные частичного представления обратно в модель при отправке обратно на мой контроллер? - PullRequest
3 голосов
/ 16 декабря 2009

Вопрос новичка 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 имеет значение null.

Я неправильно использую привязку модели или для моего действия требуются отдельные параметры для Customer и Address?

Ответы [ 3 ]

2 голосов
/ 16 декабря 2009

Действие POST вообще не знает представления. Он не знает или не заботится о том, что было задействовано частичное представление.

Единственное, что он видит , это POSTed HTML-форма. Вы можете увидеть это в Firebug или Fiddler. Таким образом, вы можете иметь только один Customer аргумент действия POST , если форма имеет правильные имена и значения ключей.

Есть много правил по этому поводу, но ответ на ваш вопрос заключается в том, что тот факт, что вы использовали частичное представление, никак не влияет на привязку модели к POST. Единственное, что имеет значение, - это содержание формы.

2 голосов
/ 24 ноября 2010
2 голосов
/ 16 декабря 2009

Он должен быть привязан к клиенту, так как клиент определяет тип свойства адреса (адрес). ваш адрес Partial View должен определять имена как

//Here the Model refers to Model.Address in the PartialView
<%=Html.TextBox("Address.property1", Model.property1) %>

Таким образом, ModelBinder знает, что свойства адреса должны быть связаны с частью свойства Address объекта customer.

РЕДАКТИРОВАТЬ: Добавить адрес к именам элементов:

<%=Html.DropDownList("Address.CountryId", new SelectList(Country.GetAll(), "Id", "Name") })%>
<%=Html.DropDownList("Address.CountrySubdivisionId", new SelectList(CountrySubDivision.GetByCountryId(Model.CountryId), "Id", "Name"))%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...