List的C#空值,即使它已初始化为空

时间:2017-01-03 12:42:46

标签: c# asp.net-mvc

我有一个提交类似于此

的ViewModel的表单
public class MyViewModel
{
    public IList<MyItem> MyList { get; set; } = new List<MyItem>();
}

问题在于,在某些情况下,此List可能为null,但我想阻止这种情况。我希望此列表从不为空。

我认为初始化它就足够了,但我错了。我怎样才能达到这个结果?

2 个答案:

答案 0 :(得分:0)

NotNull属性,它只是一个骨架,没有实现。 MVC团队计划用它做点什么,但随后他们把它扔掉了,它就消失了。有关详情,请参阅this答案。

确保您的控制器将非空列表传递给所有视图。执行此操作的最佳方法是为视图创建另一个模型,并在该模型的构造函数中始终new向上列出该模型并将该模型传递给您的视图。

答案 1 :(得分:0)

您需要构建一个自定义ModelBinder,继承自DefaultModelBinder并从基类获取结果,检查结果,如果它是NULL,则将其初始化为新的空列表。 例如:

public class NotNullListBinder : DefaultModelBinder
    {

        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            if (bindingContext.ModelType == typeof(MyViewModel))
            {
                var result = base.BindModel(controllerContext, newBindingContext);
                if(result != null && result.MyList == null)
                 {
                    result.MyList = new new List<MyItem>();
                    return result;
                  }
            }
            else
            {
                return base.BindModel(controllerContext, bindingContext);
            }
        }

    }

在你的Global.asax.cs中:你必须注册这个模型绑定器并将其链接到你的视图模型

ModelBinders.Binders.Add(typeof(MyViewModel), new NotNullListBinder ());