Asp.net mvc BindModel在绑定到列表/集合时返回null(但在绑定到csla集合时不返回null)

Asp.net mvc BindModel在绑定到列表/集合时返回null(但在绑定到csla集合时不返回null),asp.net-mvc,model-binding,Asp.net Mvc,Model Binding,我有一个自定义模型绑定器,它继承了如下所示的DefaultModelBinder Public Class GridFormBinder : Inherits DefaultModelBinder Public Overrides Function BindModel(controllerContext As System.Web.Mvc.ControllerContext, bindingContext As System.Web.Mvc.ModelBindingContext) As Ob

我有一个自定义模型绑定器,它继承了如下所示的DefaultModelBinder

Public Class GridFormBinder : Inherits DefaultModelBinder

Public Overrides Function BindModel(controllerContext As System.Web.Mvc.ControllerContext, bindingContext As System.Web.Mvc.ModelBindingContext) As Object
    Dim result As Object = MyBase.BindModel(controllerContext, bindingContext)

    'Code to handle special case for grid/List binding.

    Return result
End Function 
End Class
我使用此自定义活页夹的原因是,我在网格中呈现各种项目列表(使用devexpress mvc gridview),并将网格中的控件绑定到项目列表

如果我使用一个从BusinessCollectionBase派生的类(来自一个经过修改的CSLA框架类),那么一切工作都与我想要的完全一样。BusinessCollectionBase派生自一个类似于

 <Serializable()> Public MustInherit Class BindableCollectionBase(Of T As IBusinessData)
        Inherits CollectionBase
        Implements IBindingList
        Implements System.Collections.Generic.IEnumerable(Of T)
Public必须继承类BindableCollectionBase(作为IBusinessData的T)
继承CollectionBase
实现IBindingList
实现System.Collections.Generic.IEnumerable(Of T)
但是,如果我绑定到从
BindingList
MyBase.BindModel(controllerContext,bindingContext)继承的类,则总是不返回任何内容。我尝试了各种泛型和非泛型BCL集合,BindModel方法总是返回null


要让DefaultModelBinder创建并返回用于常规集合的模型,我必须做些什么吗?

我查看了DefaultModelBinder的源代码并解决了问题

在BindComplexModel方法中的DefaultModelBinder中,如果类型不是数组并且是泛型IEnumerable(IEnumerable),并且是ICollection的实例,则它将调用UpdateCollection。由于所述的所有原因,它无法填充集合。因为count=0,UpdateCollection方法返回null。因此,从ICollection派生的类(例如BindingList)将具有这种行为

然而,我的自定义集合实际上派生自旧的CollectionBase类(它单独实现了泛型IEnumerable)。这意味着BindComplexModel不会尝试填充集合,而是像往常一样绑定到对象*

我个人认为这是一个错误,或者至少是一个疏忽。如果您要绑定到一个集合,并且表单有0个项目(假设用户已删除所有行),则默认绑定不会返回任何内容。但是你不应该只得到零项的集合吗?什么都不退的原因是什么?这给MVC开发人员带来了更多的工作,因为现在他们必须首先检查没有任何内容

但无论如何,这就是原因

*这也是我无法让绑定到集合的示例用于我的类的原因。它们不是数组,但也不是IEnumerable或IDictionary。我想还有一个bug