Не связыватель модели в список поддерживаемых бета ASP.NET в MVC <T>?
-
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 подобным образом, но вам нужно изменить некоторые строки.Подробнее читайте здесь:
и здесь:
ASP.NET MVC:Как мне передать список (из класса в Модели) повторителю в представлении?
Надеюсь, это поможет
Редактировать
Если вы используете модель, вам нужно сначала настроить DataContext и выбрать список, но, конечно, вы можете использовать классы, созданные при использовании LINQ.
Я определил похожий объект.Я прочитал сообщение о привязке к списку, как указано выше, Хотя привязка работает, я не смог использовать белый список Bind или черный список в параметре действия контроллера.Модель является IList