Привязка модели MVC3 к методу моего детского действия - PullRequest
0 голосов
/ 19 сентября 2011

Я использую MVC3 и пытаюсь использовать функцию Child Action @Html.Action(), поэтому у меня есть представление со следующим


    @foreach (var item in Model.Items){
        @Html.Action("GetFormItemView", "Question", item});
    }

Это вызывает следующий метод


    [ChildActionOnly]
    public ActionResult GetFormItemView(FormItem formItem)
    {
        if (formItem is FormSection)
        {
            return GetSectionView(formItem as FormSection);
        }
        else if (formItem is QuestionItem)
        {
            return GetTypedQuestionView(formItem as QuestionItem);
        }
        else
        {
            throw new NotImplementedException();
        }
    }

В этот момент бомбы Model Bind говорят мне, что не могут создать абстрактный класс ....

Ошибка сервера в приложении '/'.Невозможно создать абстрактный класс.Описание: во время выполнения текущего веб-запроса произошло необработанное исключение.Просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.MissingMethodException: Невозможно создать абстрактный класс.

Как мнечтобы связыватель моделей убирался с моего пути - я предоставил Акции необходимую модель ...?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2011

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

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

Самое простое решение - создать отдельные действия для каждого конкретного типа модели.Существуют более сложные решения, вы можете проверить этот вопрос для примеров.

0 голосов
/ 19 сентября 2011

Удар в темноте, но я думаю, что вам нужно:

@foreach (var item in Model.Items){
   @Html.Action("GetFormItemView", "Question", new {formItem = item});
}
...