Полагаю, это история о том, как фреймворки с радостью делают 95% от того, что вам нужно, но затем неодобрительно хмуро смотрят на эти последние пять процентов;Сообщаем вам, что если вы хотите участвовать в нестандартной малярии, это ваше личное дело, большое спасибо, и это будет здесь, если вы решите, что хотите вернуться к тому, в чем он хорош.Вообще говоря, это неизбежно, что эти последние пять процентов будут содержать какую-то версию обязательной функции.
У меня строго типизированное представление, которое обновляет объект данных.Я использовал идиоматические помощники MVC2, например Html.TextBoxFor(model = > model.Name)
.Я использовал шаблоны редактора для вложенных объектов.(Мой бэкэнд представляет собой коллекцию документов Mongo, поэтому мне нужно представлять сложные типы).
Затем мне нужен раскрывающийся список.Оказывается, выпадающие списки немного привередливы;нет проблем, я сделаю модель представления вместо прямой передачи item
:
class itemViewModel
{
...
public Item item { get; set; }
public IEnumerable<SelectListItem> dropdown { get; set; }
}
public ActionResult()
{
return View("Update", new itemViewModel(item, dropdown))
}
..., которая работает нормально, выпадающий список заполняется.Но!мой взгляд требует обновления:
Html.TextBoxFor(model => model.Name) ->
Html.TextBoxFor(model => model.item.Name)
Отлично, проблема решена.К сожалению, теперь моя модель привязки не работает.Я отлаживаю и смотрю на Request.Form
значения: Ох.item.Name
вместо Name
.Имеет смысл.Я говорю моему представлению Update ожидать itemViewModel
вместо этого, и привязка работает.
Ой, подождите, нет, это не так.Потому что у меня есть вложенные объекты, которые используют редакторы.Они строго типизированы и не знают, что полученная модель на самом деле является свойством модели представления.Таким образом, они по-прежнему выплевывают Address.City
вместо item.Address.City
, и привязка не выполняется.
Я могу придумать несколько обходных путей:
- Написать специализированное пользовательское связующее для модели
- Поместите всю чертову форму в свой собственный типизированный редактор, чтобы она получала модель
item
, не зная, что это свойство - Убейте модель представления и взломайте раскрывающийся список, используя словарь
ViewData
- Выйдите из
HtmlHelpers
и напишите вручную всю форму - Напишите мои собственные
HtmlHelper
расширения, которые будут принимать lamba и объект модели в качестве параметров. - Поместите каждую группировку ярлыков / полей в отдельный шаблон редактора.
Все это ощущается как излишнее или неряшливое.Viewmodels, кажется, чистый, полезный подход.Означает ли их использование, что я должен быть неаккуратным в других областях или воспроизводить незначительные вариации на значительных кусках структуры?Я учил себя C # в течение последних трех месяцев (графический дизайнер, пытающийся выяснить, что за чертова статическая типизация без CS-фона, наверное, было довольно забавно наблюдать).Я работаю в изоляции;Там нет никого, чтобы узнать лучшие практики из.Я чувствую, что если я не выучу некоторые из них, у меня останется куча навоза.Итак, ваше мнение ценится.