Напротив "привязки модели к списку" - PullRequest
0 голосов
/ 20 января 2009

Мне бы хотелось узнать мнение людей о том, как лучше всего поступить наоборот Модель Фила Хаака, привязывающаяся к списку . У меня есть форма, которая содержит несколько отдельных полей, а также поля формы, которые создаются динамически с помощью JQuery. Это означает, что когда я запрашиваю у базы данных что-то для редактирования, она вернет объект, который сам по себе будет иметь n объектов (каждый из которых одинаков), прикрепленных к нему.

Я хотел бы знать, что люди предложат в качестве наилучшего способа создания «динамических» частей форм и, в частности, обеспечения выбора правильных элементов для раскрывающихся списков. У меня есть смутное представление о том, что это будет включать просмотр пользовательских элементов управления, но я пытаюсь понять, как все это собрать вместе.

Форма:

<form action="/MyItems/Edit" method="post">
   Title: <input type="text" name="Title" value="" /><br />
   Description <input type="text" name="Description" value="" /><br /><br />

   <input type="hidden" name="myItem.Index" value="0" />
   <input id="item[0].Amount" name="item[0].Amount" type="text" value="" />
   <select id="item[0].selectA"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>
   <select id="item[0].selectB"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>

   <input type="hidden" name="myItem.Index" value="1" />
   <input id="item[1].Amount" name="item[1].Amount" type="text" value="" />
   <select id="item[1].selectA"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>
   <select id="item[1].selectB"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>

   <input type="hidden" name="myItem.Index" value="2" />
   <input id="item[2].Amount" name="item[2].Amount" type="text" value="" />
   <select id="item[2].selectA"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>
   <select id="item[2].selectB"><option value="1">1</option>
   <option value="2">2</option><option value="3">3</option></select>
</form>

Все, от скрытого ввода до конца второго списка выбора, может быть повторено n раз. DTO, который гидратируется из запроса к базе данных, выглядит следующим образом:

public class MyItem
{
    public string Name { get; set; }
    public string Description { get; set; }
    public IEnumerable<SelectItem> SelectItems { get; set; }
}

Каждый SelectItem выглядит следующим образом:

public class SelectItem
{
    public int SelectA { get; set; }
    public int SelectA { get; set; }
}

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

Ответы [ 2 ]

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

Завершение этого в UserControl или в вашем собственном методе расширения HtmlHelper приведёт в порядок представление, но по сути вы хотите что-то вроде этого:

<%  int idx = 0;
    foreach (SelectItem item in myItem.SelectItems) { %>
<input type="hidden" name="myItem.Index" value="<%= idx %>" />
<input id="item[<%= idx %>].Amount" name="item[<%= idx %>].Amount" type="text" value="" />
<select id="item[<%= idx %>].selectA">
  <option <%= item.selectA == 1 ? "selected" : "" %> value="1">1</option>
  <option <%= item.selectA == 2 ? "selected" : "" %> value="2">2</option>
  <option <%= item.selectA == 3 ? "selected" : "" %> value="3">3</option>
</select>
<select id="item[<%= idx %>].selectB">
  <option <%= item.selectB == 1 ? "selected" : "" %> value="1">1</option>
  <option <%= item.selectB == 2 ? "selected" : "" %> value="2">2</option>
  <option <%= item.selectB == 3 ? "selected" : "" %> value="3">3</option>
</select>
<%  idx++;
    } %>

Оберните это в свои теги form, и оно должно отображаться очень хорошо, при условии, что ваш экземпляр MyItem называется myItem. Вы можете заключить повторяющиеся теги option в другой цикл, если ваши значения также хранятся в коллекции.

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

Чтобы завершить это, я создал цикл while для циклического просмотра элементов формы, а затем запросил источник данных, чтобы увлажнить мои объекты. С тех пор я изменил это так, что тот же код теперь находится внутри пользовательского связывателя моделей. Очень аккуратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...