【问题标题】:C# null value for a List even if it was initialized as empty列表的 C# 空值,即使它被初始化为空
【发布时间】:2017-01-03 21:48:16
【问题描述】:

我有一个提交类似于此的 ViewModel 的表单

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

问题是,在某些情况下,这个 List 可能为空,但我想防止这种情况发生。我希望这个列表永远为空。

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

【问题讨论】:

  • 您能否提供您的视图代码,您在其中执行了模型与 HTML 控件的绑定?在这种情况下,问题很可能出现在视图级别
  • 观点很好,相信我,但这不是重点。重点是:即使视图返回空值错误,我也希望将空值转换为空列表。

标签: c# asp.net-mvc


【解决方案1】:

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

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

【讨论】:

  • NotNull 来自 Resharper 注释。
【解决方案2】:

您需要构建一个自定义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 ());

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 2022-06-22
    • 2018-07-15
    • 2012-11-10
    • 2012-12-31
    • 1970-01-01
    • 2018-12-22
    • 2016-11-26
    相关资源
    最近更新 更多