【问题标题】:MVC3 Model Binding in the way of my Child Action Method以我的子操作方法的方式进行 MVC3 模型绑定
【发布时间】:2011-11-20 08:35:21
【问题描述】:

我正在使用 MVC3 并尝试利用子操作功能 @Html.Action() 所以我有以下视图

@foreach(Model.Items 中的变量项){ @Html.Action("GetFormItemView", "问题", item}); }

这会调用下面的方法

[仅限儿童操作] 公共 ActionResult GetFormItemView(FormItem formItem) { if (formItem 是 FormSection) { 返回 GetSectionView(formItem 作为 FormSection); } else if (formItem 是 QuestionItem) { 返回 GetTypedQuestionView(formItem 作为 QuestionItem); } 别的 { 抛出新的 NotImplementedException(); } }

此时模型绑定炸弹告诉我它无法创建抽象类....

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

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

如何让模型绑定器不碍事 - 我已经为 Action 提供了必要的模型...?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 Daryl 的回复 - 我确实尝试过,但没有解决问题
    【解决方案2】:

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

    模型绑定器应该足够聪明,可以遍历基类的后代并实例化正确的子类,但不幸的是,事实并非如此。可能有一些边缘情况会导致这种情况不可靠。

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

    【讨论】:

    • 感谢您的快速回复 - 我已阅读您发布的链接。我知道模型绑定器不知道要使用哪个具体类。但是 - 我已经从父视图中给了它具体的类。我基本上不需要模型绑定器参与进来,只需将参数传递给 Action。有什么想法吗?
    • 在这种情况下,不要使用容器类,而是单独接受所有参数。这对我有用。
    • FormItem 是一个基类,与其说是一个容器类,不如说是一个容器类——将它解构为单个参数会产生很长的方法签名,我必须解决多态性——目前这不是一个选项。如果我误解了您的意图,请告诉我...
    • @Jon Hoguet - 那么你应该使用局部视图。 Html.Action 完成绑定过程。没办法,Partial Views 不行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多