【问题标题】:Asp.Net MVC 2 DefaultModelBinder error using abstract classes使用抽象类的 Asp.Net MVC 2 DefaultModelBinder 错误
【发布时间】:2010-03-05 13:40:52
【问题描述】:

我有一个使用抽象类的简单 Poco-Model,它似乎不适用于 Asp.net MVC 2 的 Default ModelBinder。 一个 Item 在一个集合中有多个 Object,它们都使用相同的抽象基类。

型号:

    public partial class Item
    {  
        public virtual ICollection<Core.Object> Objects
        {
            get
            {
                return _objects;
            }
            set
            {                
                    if (value != _objects)
                    {
                        _objects = value;
                    }
            }
        }
        private ICollection<Core.Object> _objects;
    }   


 public abstract partial class Object
    {

        public virtual Item Item
        {
            get
            {
                return _item;
            }
            set
            {
                if (!Object.ReferenceEquals(_item, value))
                {
                    _item = value;
                }
            }
        }
        private Item _item;       

    }

    public partial class TextObject : Object
    {
        public virtual string Text { get; set; }
    }

实例:

var NewItem = new Item();                    
var TextObject1 = new TextObject
{
   Text = "Text Object Text",
   Item = NewItem
};                      
List<Core.Object> objects = new List<Core.Object>(){TextObject1};            
NewItem.Objects = objects;

使用该项目的默认 Html.EditorForModel() 帮助器和 Objects 集合中的一个 TextObject 我得到一个像这样的 html 输入字段:

<input class="text-box single-line" id="Objects_0__Text" name="Objects[0].Text" type="text" value="Text Object Text" />

回发到控制器时,我从默认 ModelBinder 收到“无法创建抽象类”错误消息。显然,活页夹试图实例化那个抽象基类。但是我不知道为什么,因为集合中只有一个继承的TextObject类型的对象。 有没有其他方法可以在不编写自定义 Modelbinder 的情况下使其正常工作?

【问题讨论】:

    标签: asp.net-mvc-2 abstract-class defaultmodelbinder


    【解决方案1】:

    您必须使用自定义模型绑定器或使用视图模型。模型绑定器只知道您用作操作参数的类型(包含抽象类)。然后它尝试将请求中的值映射到该模型。绑定器无法知道它应该使用其他一些实现以及可能是什么实现。

    我的建议是创建更简单的视图模型并使用automapper 映射它们。

    【讨论】:

    • 谢谢,我试试 automapper。您是否建议在视图模型中包含 n 个派生对象类型列表? (List、List 等)
    【解决方案2】:

    查看 MvcContrib 中的 DerivedTypeModelBinder。 TypeStamping 将元数据注入到视图渲染中,为派生的typemodelbinder 提供正确调用要实例化的对象所需的信息。与此链接的更长讨论

    MVC2 Modelbinder for List of derived objects

    【讨论】:

      【解决方案3】:

      我认为您必须在 Item 类中将 Objects 集合指定为ICollection&lt;TextObject&gt;。 否则,默认模型绑定器将无法实现它应该创建的对象。 如果您决定创建自定义模型绑定器,则需要在表单中为每个对象添加一个指示其类型的字段。 问候。

      【讨论】:

      • 因为它是一个 TPT EF 模型,我需要坚持 ICollection 抽象定义。似乎自定义模型绑定器是唯一的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多