Привязка модели MVC3 к методу моего детского действия

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

    @foreach (элемент var в Model.Items){
        @Html.Action("GetFormItemView", "Question", item});
    }

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

    [ChildActionOnly]
    public ActionResult GetFormItemView(FormItem formItem)
    {
        if (formItem - это FormSection)
        {
            вернуть GetSectionView(formItem как FormSection);
        }
        иначе если (formItem является QuestionItem)
        {
            return GetTypedQuestionView(formItem as QuestionItem);
        }
        еще
        {
            бросить новый NotImplementedException();
        }
    }

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

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

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

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

2 ответа

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

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

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

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

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

Другие вопросы по тегам