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