我正在使用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提供了必要的模型......?
答案 0 :(得分:0)
在黑暗中刺伤,但我认为你需要:
@foreach (var item in Model.Items){
@Html.Action("GetFormItemView", "Question", new {formItem = item});
}
答案 1 :(得分:0)
问题是模型绑定器不知道如何仅根据参数重新创建具体类。自己查看视图,你会发现Model Binder无法知道如何创建正确的类。
模型绑定器应该足够聪明,可以遍历基类的后代并实例化正确的后代,但不幸的是,它不是。可能存在边缘情况使其不可靠。
最简单的解决方案是为每个具体的模型类型创建单独的操作。存在更复杂的解决方案,您可以查看this question示例。