C# 自定义属性getter的模型绑定错误

C# 自定义属性getter的模型绑定错误,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,当我尝试使用以下两个属性绑定模型时,在模型绑定过程中出现错误: private IEnumerable<Claimant> _drivers; public IEnumerable<Claimant> Drivers { get { return _drivers ?? Enumerable.Empty<Claimant>(); } set

当我尝试使用以下两个属性绑定模型时,在模型绑定过程中出现错误:

    private IEnumerable<Claimant> _drivers;
    public IEnumerable<Claimant> Drivers
    {
        get
        {
            return _drivers ?? Enumerable.Empty<Claimant>();
        }
        set
        {
            _drivers = value;
        }
    }

    private IEnumerable<Property> _vehicles;
    public IEnumerable<Property> Vehicles
    {
        get
        {
            return _vehicles ?? Enumerable.Empty<Property>();
        }
        set
        {
            _vehicles = value;
        }
    }
    public IEnumerable<Claimant> Drivers { get; set; }
    public IEnumerable<Property> Vehicles { get; set; }
试着这样做:

get 
{
    return _drivers ?? new List<Claimant>();
}
get
{
返回_驱动程序??新列表();
}

在自定义getter中,我通常看到null合并运算符(??)用于在返回时设置私有支持字段:

private IEnumerable<Claimant> _drivers;
public IEnumerable<Claimant> Drivers
{
    get
    {
        return _drivers ?? (_drivers = Enumerable.Empty<Claimant>());
    }
    set
    {
        _drivers = value;
    }
}

IIRC
Enumerable.Empty
是一个静态只读可枚举文件,用于将空存储不可知的可枚举文件传递给方法。它不是用来作为空集合的“起点”。这很可能就是为什么会出现错误

选择一种存储机制(例如,
列表
),并将其用作备份字段的类型。然后可以初始化它

  • 在类定义中
  • 在构造函数中,或
  • 首先得到:
  • 示例:

    private List<Claimant> _drivers = new List<Claimamt>();  // Option 1
    
    public MyModel()
    {
        _drivers = new List<Claimant>();   // Option 2
    }
    
    public IEnumerable<Claimant> Drivers
    {
        get
        {
            return _drivers ?? (_drivers = new List<Claimant>()); // Option 3
        }
        set
        {
            _drivers = value;
        }
    }
    
    private List _drivers=new List();//选择1
    公共MyModel()
    {
    _驱动程序=新列表();//选项2
    }
    公共数字驱动程序
    {
    得到
    {
    返回_drivers???(_drivers=new List());//选项3
    }
    设置
    {
    _驱动因素=价值;
    }
    }
    
    找出导致问题的确切属性名称和类型:

    public class TestBinder: DefaultModelBinder
    {
        public override object BindModel(
                ControllerContext controllerContext,
                ModelBindingContext bindingContext)
        {
            Debug.WriteLine(bindingContext.ModelName);
            Debug.WriteLine(bindingContext.ModelType.ToString());
    
            //HOW TO USE: Look at your Output for the most recently output ModelName and Type to determine where there problem lies
    
            return base.BindModel(controllerContext, bindingContext);
        }
    }
    
    将此活页夹设置为默认活页夹:

    ModelBinders.Binders.DefaultBinder = new TestBinder();
    

    这纠正了错误,只是整个事情对我来说很奇怪。我想我必须深入研究默认绑定器源代码,看看它到底在这里做什么。属性返回的集合必须是动态的,而不是静态只读数组,因为模型绑定器试图调整它的大小。有一个类似的问题,我检查了方法是否是公共的和特殊的方法属性,尽管这很简单,比如将
    Enumerable.Empty()
    更改为
    newlist()
    。干杯@DarinDimitrov!仅供参考,我在将数组默认为空数组(而不是null)时也遇到了这个问题。解决方案是将数组设置为null,或者创建一个新的模型绑定器,如图所示(尽管我还没有尝试这两种解决方案):
    private List<Claimant> _drivers = new List<Claimamt>();  // Option 1
    
    public MyModel()
    {
        _drivers = new List<Claimant>();   // Option 2
    }
    
    public IEnumerable<Claimant> Drivers
    {
        get
        {
            return _drivers ?? (_drivers = new List<Claimant>()); // Option 3
        }
        set
        {
            _drivers = value;
        }
    }
    
    public class TestBinder: DefaultModelBinder
    {
        public override object BindModel(
                ControllerContext controllerContext,
                ModelBindingContext bindingContext)
        {
            Debug.WriteLine(bindingContext.ModelName);
            Debug.WriteLine(bindingContext.ModelType.ToString());
    
            //HOW TO USE: Look at your Output for the most recently output ModelName and Type to determine where there problem lies
    
            return base.BindModel(controllerContext, bindingContext);
        }
    }
    
    ModelBinders.Binders.DefaultBinder = new TestBinder();