当模型类型从CollectionBase继承时,ASP.NET MVC模型绑定返回null

时间:2016-09-29 16:35:58

标签: asp.net-mvc

这是我的模特

public class MessageSetTypeCollection<T> : CollectionBase where T : MessageSetType, new()
{
    public string Name { get; set; }
    public string[] Tags { get; set; }

    public MessageSetType this[int index]
    {
        get
        {
            return (MessageSetType)List[index];
        }
    }

    public void Add(MessageSetType value)
    {
        List.Add(value);
    }
}

这是我的控制器动作

public ActionResult TestAction()
{
    MessageSetTypeCollection<MessageSetType> Model = new MessageSetTypeCollection<MessageSetType>();
    Model.Add(new MessageSetType()
    {
        Alert = "test"  // Alert is a public property of the MessageSetType class
    });
    Model.Add(new MessageSetType()
    {
        Alert = "test2"
    });
    return View(Model);
}

[HttpPost]
public void TestAction(MessageSetTypeCollection<MessageSetType> Model)
{
    return;
}

在视图中我已经使用了此代码

@using (Html.BeginForm())
{
    @Html.EditorFor(a => a[0].Alert)
    @Html.EditorFor(a => a[1].Alert)

    <input type="submit" value="OK" />
}

当我将此表单提交给TestAction操作时,Model参数的内部列表具有Count 0元素。为什么呢?

我还使用List<MessageSetType>模型类型而不是MessageSetTypeCollection<MessageSetType>测试了此代码,并且所有代码都正常运行。错误在哪里?

2 个答案:

答案 0 :(得分:0)

请参阅此处的List源代码: http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs

实施方式非常不同。您没有一个MessageSetType类型的集合,您的索引器应该在其上工作。

我认为您可以使用源代码调整模型:MessageSetTypeCollection。

答案 1 :(得分:0)

我已经决定从MessageSetTypeCollection<T>继承List<T>而不是CollectionBase

public class MessageSetTypeCollection<T> : List<T> where T : MessageSetType, new()
{
    //Omissis
}