MVC3模型以我的Child Action方式绑定

时间:2011-09-19 15:22:35

标签: asp.net-mvc asp.net-mvc-3 model-binding child-actions

我正在使用MVC3并且正在尝试利用子动作功能@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();
        }
    }

此时模型绑定炸弹告诉我它不能创建一个抽象类......

  '/'应用程序中的服务器错误。   无法创建抽象类。   描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。

     

异常详细信息:System.MissingMethodException:无法创建抽象类。

如何让模型绑定器脱离我的方式 - 我已经为Action提供了必要的模型......?

2 个答案:

答案 0 :(得分:0)

在黑暗中刺伤,但我认为你需要:

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

答案 1 :(得分:0)

问题是模型绑定器不知道如何仅根据参数重新创建具体类。自己查看视图,你会发现Model Binder无法知道如何创建正确的类。

模型绑定器应该足够聪明,可以遍历基类的后代并实例化正确的后代,但不幸的是,它不是。可能存在边缘情况使其不可靠。

最简单的解决方案是为每个具体的模型类型创建单独的操作。存在更复杂的解决方案,您可以查看this question示例。