4

我有一个使用抽象类的简单 Poco 模型,它似乎不适用于 Asp.net MVC 2 的默认 ModelBinder。一个项目在一个集合中有多个对象,都使用相同的抽象基类。

模型:

    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;

在 Objects 集合中使用带有一个 TextObject 的该项目的 Default Html.EditorForModel() Helper 我得到一个像这样的 html 输入字段:

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

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

4

3 回答 3

3

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

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

于 2010-03-05T13:50:31.640 回答
2

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

派生对象列表的 MVC2 Modelbinder

于 2010-06-22T14:56:15.380 回答
0

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

于 2010-03-05T13:53:30.653 回答