Связывание модели в списке поддержки бета-версии ASP.NET MVC<T>?

Возьмите пример классов ниже. Я хочу отобразить клиента и два адреса (из списка) в форме. Поддерживает ли это механизм связывания в бета-версии MVC, или мне придется написать свой собственный механизм связывания?

public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<Address> Addresses { get; set; }

    public Customer()
    {
        Addresses = new List<Address>();
    }

}

public class Address
{
    public int Line1 { get; set; }
    public int Line2 { get; set; }
    public int City { get; set; }
    public int State { get; set; }
    public int Zip { get; set; }
}

Как бы вы кодировали поля? Как это?

<!-- some HTML formatting -->
<%= Html.TextBox("customer.address.line1", ViewData.Customer.Address[0].Line1)%>
<!-- some more HTML formatting -->
<%= Html.TextBox("customer.address.line1", ViewData.Customer.Address[1].Line1)%>
<!-- end of HTML form formatting -->

5 ответов

Решение

Я никогда не пробовал, но посмотрите этот пост, он касается привязки модели к списку, может быть, он может вам помочь.

Вы можете передать список объектов с помощью ViewData, но вам нужно изменить некоторые строки. Узнайте больше здесь:

http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx

и здесь:

ASP.NET MVC: как передать список (из класса в модели) в повторитель в представлении?

Надеюсь это поможет


редактировать


Если вы используете модель, вам нужно сначала настроить DataContext и выбрать список, но вы обязательно можете использовать сгенерированные классы, если используете LINQ.

Просто чтобы сделать это завершенным. Важно, чтобы вы использовали скрытые поля с именем Index. Таким образом, мой код выше становится следующим:

<!-- some HTML formatting -->
<%= Html.Hidden("customer.address.Index", 0) %>
<%= Html.TextBox("customer.address[0].line1", ViewData.Customer.Address[0].Line1)%>
<!-- some more HTML formatting -->
<%= Html.Hidden("customer.address.Index", 1) %>
<%= Html.TextBox("customer.address[1].line1", ViewData.Customer.Address[1].Line1)%>
<!-- end of HTML form formatting -->

Отлично работает!

Используйте NameValueDeserializer MvcContrib, чтобы упростить его. Предположим, что ваша страница происходит от ViewPage. Вы можете сделать это:

<%= Html.TextBox("Address[0].Line1", ViewData.Model.Address[0].Line1)%>
<%= Html.TextBox("Address[1].Line1", ViewData.Model.Address[1].Line1)%>

И это:

public ActionResult Save([Deserialize]Customer customer)

И клиент будет десериализован из поста формы с заполненной коллекцией адресов. Ваши индексы не должны быть в последовательности - это поддерживает случаи, когда вы хотите удалить строки на стороне клиента до того, как публикация произойдет.

В случае, если вы десериализуете что-то из словаря данных представления (вместо модели), то синтаксис будет выглядеть как [Deserialize("customer")], где "customer" - это префикс.

Вы можете найти этот пост интересным и актуальным.

Я определил похожий объект. Я следовал за постом о привязке к списку, как указано выше, хотя привязка работает, я не смог использовать белый или черный список привязки в параметре действия контроллера. Модель это IList

Другие вопросы по тегам