MVC Custom ViewModel и автоматическое связывание - PullRequest
8 голосов
/ 19 апреля 2009

У меня есть пользовательская ViewModel, определенная как:

public class SampleFormViewModel
{
    public SampleFormViewModel(SelectList companies, Widget widget)
    {
        Companies = companies;
        Widget = widget;
    }

    public SelectList Companies { get; private set; }
    public Widget Widget { get; private set; }
}

В моем обработчике Edit POST у меня есть следующая запись:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(SampleFormViewModel model)
{

Форма редактирования настроена как:

Inherits="System.Web.Mvc.ViewPage<Sample.Web.Models.SampleFormViewModel>"

И он просто взрывается, не уверен, что происходит, имеет следующую ошибку: Для этого объекта не определен конструктор без параметров. Конечно, я упускаю что-то действительно очевидное здесь. Некоторый фон, GET работает отлично и отображает выпадающий список SelectList, как и ожидалось. Я предполагаю, что автоматическое связывание с моделью настраиваемого представления не работает, но я не уверен, что с этим делать.

Ответы [ 2 ]

8 голосов
/ 19 апреля 2009

У вас должен быть конструктор без параметров, и я считаю, что свойства должны иметь открытые установщики. Связыватель по умолчанию создает объект с помощью конструктора, который не принимает параметров, а затем использует отражение в открытых свойствах для установки значений из параметров формы / запроса.

public class SampleFormViewModel
{
    public SampleFormViewModel() { }

    public SelectList Companies { get; set; }
    public Widget Widget { get; set; }
}

Однако я подозреваю, что вы действительно хотите получить не модель представления, а лежащую в основе модель виджета и выбрать значение списка в публикации формы. Я не думаю, что компоновщик сможет восстановить список SelectList для поста, поскольку он имеет только выбранное значение в параметрах.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit( int CompanyID, Widget widget )
{
}
2 голосов
/ 21 сентября 2010

MVC требует, чтобы в строго типизированных представлениях представление могло создать класс, используемый в этом представлении. Это означает конструктор без каких-либо параметров. И это имеет смысл. Люди, плохо знакомые с MVC, увидят подобное "а?" проблемы, когда они забывают / не в состоянии сделать параметры общедоступными, и все подобные связанные с этим ошибки появляются, когда представление пытается собраться (в отличие от ошибки компилятора).

Но что «интересно» в этом классе проблем с конструкторами без параметров, так это то, что свойство вашего класса также НЕ имеет конструктора без параметров. Я полагаю, это пессимистический подход?

Потратив некоторое время на изучение класса SelectList - класса, специфичного для MVC, - я хотел помочь некоторым людям сэкономить несколько минут / часов.

Этот действительно важный инструмент / класс для создания выпадающего списка имеет следующие конструкторы:

public SelectList (IEnumerable items); public SelectList (IEnumerable items, object selectedValue); public SelectList (IEnumerable items, string dataValueField, string dataTextField); public SelectList (IEnumerable items, string dataValueField, string dataTextField, object selectedValue);

.. и, следовательно, если это свойства вашего класса (того, что использовалось для представления), MVC выдаст вам неуловимую ошибку «Нет конструктора без параметров».

НО, если вы создаете что-то вроде вспомогательного класса, вырезайте и вставляйте точный код из вашего исходного класса, а затем сделайте этот вспомогательный класс параметром (НЕ get / set) в вашем исходном классе; ты в порядке

И таким образом, вы можете использовать один вид для получения и сообщений. Что красивее:)

Лично я бы создал компилятор, чтобы распознавать ассоциации и требования строго типизированных представлений, или позволить раскрывающемуся списку (или другому «клиенту» списка SelectList) просто не работать, а не задаться вопросом, существует ли определенный уровень рекурсивной проверки на безпараметрических конструкторах.

К счастью, текущая версия кажется только верхнего уровня. Чувствуется, как взломать, и я надеюсь, что это по замыслу

НТН.

...