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

Возьмите пример классов ниже. Я хочу отобразить клиента и два адреса (из списка) в форме. Поддерживает ли это механизм связывания в бета-версии 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 ]

5 голосов
/ 02 января 2009

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

1 голос
/ 05 января 2009

Просто чтобы сделать это завершенным. Важно, чтобы вы использовали скрытые поля с именем 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 -->

Работает как шарм!

1 голос
/ 03 января 2009

Используйте 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.

Вы можете найти это сообщение в блоге интересным и актуальным.

0 голосов
/ 02 января 2009

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

0 голосов
/ 02 января 2009

Вы можете передать список объектов с помощью 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.

...