ASP.Net MVC 2: использование модели представления разрушает привязку моей модели - PullRequest
3 голосов
/ 28 января 2011

Полагаю, это история о том, как фреймворки с радостью делают 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, и привязка не выполняется.

Я могу придумать несколько обходных путей:

  1. Написать специализированное пользовательское связующее для модели
  2. Поместите всю чертову форму в свой собственный типизированный редактор, чтобы она получала модель item, не зная, что это свойство
  3. Убейте модель представления и взломайте раскрывающийся список, используя словарь ViewData
  4. Выйдите из HtmlHelpers и напишите вручную всю форму
  5. Напишите мои собственные HtmlHelper расширения, которые будут принимать lamba и объект модели в качестве параметров.
  6. Поместите каждую группировку ярлыков / полей в отдельный шаблон редактора.

Все это ощущается как излишнее или неряшливое.Viewmodels, кажется, чистый, полезный подход.Означает ли их использование, что я должен быть неаккуратным в других областях или воспроизводить незначительные вариации на значительных кусках структуры?Я учил себя C # в течение последних трех месяцев (графический дизайнер, пытающийся выяснить, что за чертова статическая типизация без CS-фона, наверное, было довольно забавно наблюдать).Я работаю в изоляции;Там нет никого, чтобы узнать лучшие практики из.Я чувствую, что если я не выучу некоторые из них, у меня останется куча навоза.Итак, ваше мнение ценится.

Ответы [ 2 ]

8 голосов
/ 28 января 2011

Вздох.Еще пара часов поиска в Google и несколько снимков в темноте, и кажется, что есть невероятно простой способ сделать это, используя атрибут Bind:

[HttpPost]
public ActionResult([Bind(Prefix="item")] item)
{
    //item's complex types populate correctly
}

Атрибут кажется разумнымдостаточно, чтобы охватить сложные типы.

Я оставлю это как дань моему собственному невежеству и надеюсь, что какой-нибудь другой несчастный n00b найдет ответ быстрее, чем я.

0 голосов
/ 28 января 2011

Даниэль, во-первых, я должен сказать, что я благодарю вас за ваши усилия и взятие на себя .NET, C # и ASP.NET MVC все в один большой кусок. Итак, вы расстроены, и я отношусь к этому. Это случается со всеми нами время от времени.

Я должен сообщить вам, что я не фанат (на самом деле ни капельки) ASP.NET MVC ( Проблемы с ASP.NET MVC Framework Design ), и поэтому я могу не даст вам разработанного решения вашей проблемы. Но вот как я хотел бы, чтобы вы увидели ситуацию, в которой вы находитесь:

Вы находитесь в лабиринте, и вы сделали один неверный поворот куда-то, и вы идете глубже в лабиринт, но вы не найдете выхода. Так что вам нужно вернуться до того неправильного поворота и посмотреть, есть ли другой маршрут. Итак, начиная с того места, где вы находитесь, спрашивайте себя «почему» для каждого сделанного вами шага / изменения и делайте резервную копию по одному шагу за раз, спрашивая, почему. Имеет ли это смысл? в конечном итоге вы попадете в точку, где у вас есть другие альтернативные способы решения той же (оригинальной) проблемы.

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