ASP.NET MVC Редактирование сборника лучших практик - Ваше мнение - PullRequest
13 голосов
/ 14 ноября 2008

Учитывая следующий класс, каково ваше мнение о наилучшем способе создания / редактирования, где 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?

Ответы [ 5 ]

14 голосов
/ 08 июля 2010

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

Контроллер

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

public ActionResult Edit(Product model)

View

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 голосов
/ 28 мая 2009

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

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

В ProductModelBinder вы выполняете итерацию значений коллекции форм и привязываетесь к сущности Product. Это делает интерфейс контроллера интуитивно понятным и может помочь в тестировании.

class ProductModelBinder : IModelBinder ...
3 голосов
/ 14 ноября 2008

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

[AcceptVerbs( HttpVerb.POST )]
public ActionResult Whatever( FormCollection form )
{
 ....
}
0 голосов
/ 14 ноября 2008

Андрей

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

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

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

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

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

public ActionResult Whatever(ILIst<Attribute> attributes, string productName ...
0 голосов
/ 14 ноября 2008

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

В моем DAL я имею дело с преобразованием Списка в сущности LINQ, обработкой вставок и удалений и т. Д.

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

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

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