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

StackOverflow https://stackoverflow.com/questions/407491

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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 -->
Это было полезно?

Решение

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

Другие советы

Используйте NameValueDeserializer от MvcContrib, чтобы упростить задачу.Давайте предположим, что ваша страница является производной от ViewPage<Customer>.Ты можешь это сделать:

<%= 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)

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

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

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

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

<!-- 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 -->

Это работает как заклинание!

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top