我有一个提交类似于此
的ViewModel的表单public class MyViewModel
{
public IList<MyItem> MyList { get; set; } = new List<MyItem>();
}
问题在于,在某些情况下,此List可能为null,但我想阻止这种情况。我希望此列表从不为空。
我认为初始化它就足够了,但我错了。我怎样才能达到这个结果?
答案 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 ());