ASP.NET MVC Редактирование коллекции Лучшие практики - ваше мнение

Учитывая следующий класс, каково ваше мнение о том, как наилучшим образом обрабатывать создание/редактирование, где Attributes.Count может быть любым числом.

public class Product {
  public int Id {get;set;}
  public string Name {get;set;}
  public IList<Attribute> Attributes {get;set;}
}

public class Attribute {
  public string Name {get;set;}
  public string Value {get;set;}
}

Пользователь должен иметь возможность редактировать как сведения о продукте (имя), так и данные атрибута (имя/значение) в том же представлении, включая добавление и удаление новых атрибутов.

Легко управлять обработкой изменений в модели, что лучше всего подходит для интерфейса UI и ActionMethod?

Ответы

Ответ 1

Используйте форму FormCollection и итерации через пары ключ/значение. Предположительно вы можете использовать схему именования, которая позволит вам определить, какие пары ключ/значение принадлежат вашему набору атрибутов.

[AcceptVerbs( HttpVerb.POST )]
public ActionResult Whatever( FormCollection form )
{
 ....
}

Ответ 2

Посмотрите сообщение блога Стив Сандерсон Редактирование списка переменных длины, ASP.NET MVC 2-style.

контроллер

Ваш метод действия получает вашу собственную модель домена Product и остается довольно простым:

public ActionResult Edit(Product model)

Вид

Edit.aspx

<!-- Your Product inputs -->
<!-- ... -->

<!-- Attributes collection edit -->
<% foreach (Attribute attr in Model.Attributes)
   {
       Html.RenderPartial("AttributeEditRow", attr);
   } %>

AttributeEditRow.ascx

Обратите внимание на вспомогательное расширение Html.BeginCollectionItem(string)

<% using(Html.BeginCollectionItem("Attributes")) { %>
    <!-- Your Attribute inputs -->
<% } %>

Возможно добавление и редактирование новых атрибутов. См. Сообщение.

Ответ 3

Используйте настраиваемое связующее устройство и напишите методы действия, как обычно:

ActionResult Edit(
  int id, 
  [ModelBinder(typeof(ProductModelBinder))] Product product
) ...

В ProductModelBinder вы перебираете значения формы и привязываетесь к объекту Product. Это обеспечивает интуитивный интерфейс Controller и может помочь в тестировании.

class ProductModelBinder : IModelBinder ...

Ответ 4

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

В моем DAL я тогда занимаюсь преобразованием объектов List в LINQ, обрабатывает вставки и удаления и т.д.

Это не самый прямой код, но он не слишком сложный для управления, и он дает пользователю ожидаемый интерфейс.

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

Ответ 5

Эндрю

Я думаю что-то немного сложнее, чем теги. В этом простом случае пара имя/значение.. цвет: красный; размер: 10; материал: хлопок.

Я думаю, что все, что можно было бы использовать на этом, может быть более сложным. То есть Добавление категории и добавление всех ее элементов на одну страницу. Относительно легко добавить еще одну строку, используя некоторый jQuery, но каково согласие на отправку информации в ActionMethod?

Вы не можете закодировать:

public ActionResult Whatever(stirng attr1Name, string attr2Name, string attr3Name ...

Также я не думаю, что это будет работать:

public ActionResult Whatever(ILIst<Attribute> attributes, string productName ...