Это мой первый вопрос 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" />
(для каждого подэлемента) - который все еще связывается с модель правильно по обратной передаче, я бы почувствовал, что эта проблема решена.