Подтвердить что ты не робот

Лучшая практика для списков сложных типов в ASP.NET MVC 3

Это мой первый вопрос SO, и это меньше, "как я это делаю" и более "что это самый чистый способ сделать это", потому что есть несколько подходов, которые я вижу, но ни один из них не кажется очень обращаясь ко мне.

Это сложная проблема для описания. По сути, у меня есть представление Add/Edit, которое позволяет пользователю редактировать поля какого-либо объекта. Этот объект довольно сложный: он имеет несколько полей и имеет под-список сложных объектов. Каждый сложный объект имеет около 40 полей больших (в основном, флажки, переключатели и даты/время). Я представлял это как избранный список:

http://fortheloot.com/public/pictures/sub-items.png

Кнопка Добавить запускает диалог с различными полями.

Вопрос здесь. Когда пользователь принимает диалоговое окно, и диалог закрывается, теперь я должен хранить эти данные где-то, так что пользователь может редактировать его дальше или добавлять другие подпозиции перед отправкой формы.

Самый очевидный способ сделать это - создать набор скрытых полей для каждого под-объекта. Таким образом, добавление подпункта добавит 40 элементов-элементов в элемент <form>. Добавьте 10 подпозиций, и у вас 400 скрытых полей. Это будет работать нормально и будет привязываться к этой модели, если поля правильно названы:

public class AddEditModel
{
  [Display(Name = "ID")]
  public int? Id { get; set; }

  [Display(Name = "Name")]
  [Required]
  [StringLength(100)]
  public string Name { get; set; }

  public IList<EntryModel> Entries { get; set; }
  public class EntryModel { /* fields */ }
}

На стороне привязки модели все выглядит довольно хорошо, но с клиентской стороны мне приходится отслеживать сотни элементов DOM, и это кажется мне громоздким. Загрузка и выгрузка из диалога различных элементов формы из 40 других элементов кажется... как будто это может быть лучше.

В идеале я хотел бы просто сохранить данные как объект javascript в элементе <option>, используя либо атрибуты data- HTML 5, либо функцию jQuery data(), которые действительно являются одними и теми же. Это сделало бы javascript-сторону вещей намного чище, но автоматически не привязалось бы к модели при обратной передаче.

Если бы существовал способ получить лучшее из обоих миров - сохранение одного объекта JS в элементе <option> или даже одного элемента <input type="hidden" /> (для каждого подэлемента) - который все еще связывается с модель правильно по обратной передаче, я бы почувствовал, что эта проблема решена.

4b9b3361

Ответ 1

Вам все равно потребуется поле html (type = hidden), чтобы отправить эти данные обратно на сервер. (Вы можете использовать пост ajax, но это, вероятно, не очень хорошая идея)

Я бы предложил создать разумную объектную модель для размещения этих структур данных и сериализовать объектную модель каждый раз, когда вы внесете ее в json с помощью stringify

Затем, когда вы отправляете форму назад, json будет отправлен на сервер, и вы можете десериализовать всю объектную модель на набор классов, написанных на С# (который может имитировать модель объекта, которую вы использовали в javascript), используя JavaScriptSerializer классы

Edit:

Чтобы десериализовать строку json, вы можете использовать следующий код:

JavaScriptSerializer js = new JavaScriptSerializer(); 
var c = js.Deserialize<MyClass>(json);
return View(c);

Если вы отправляете назад json в качестве тела сообщения сообщения (например, метод $.ajax или $.post), то привязка будет происходить автоматически с MVC3, вам просто нужно указать правильный тип контента: application/json в после; следуйте ссылке в моем комментарии ниже для более подробной информации о том, как это работает.

Martin

Ответ 3

Поскольку мы все время идем с javascript, я бы придерживался поведения JavaScript для обратной передачи. Когда вы вводите новые элементы в список, я буду продолжать наращивать массив mvftidimensional javascript, а затем преобразовывать массив в json, прежде чем отправлять его через сообщение ajax на ваш маршрут MVC.

Пока объект json соответствует стандарту именования вашей модели, MVC уже будет выполнять неявное привязку модели до того, как получит метод действия.

Какой самый простой и элегантный способ сделать это? Knockout.js! В нокауте вы создадите наблюдаемую коллекцию и добавите в свою коллекцию без грубых синтаксиса массивов javascript. Затем вы должны вызвать метод нокаута toJSON для преобразования коллекции в json перед выпуском ajax-сообщения.

Я очень рекомендую смотреть видеоролик PluralSight на нокауте, а затем загружать исходный код.

Я бы написал образец, но мне нужно вернуться к работе:)