【问题标题】:Add strings to the list of string将字符串添加到字符串列表
【发布时间】:2016-01-03 03:52:52
【问题描述】:

我正在尝试填充字符串列表,但它会引发空引用异常。

代码:

public class Validation
{
    public List<string> Errors { get; set; }
}

要存储所有验证错误的类:

public object Post(Currency currency)
{
    ClientData clientData = new ClientData();
    if (ModelState.IsValid)
    {
        new CurrencyProvider().Insert(currency);
        clientData.IsValid = true;
        clientData.Data = new CurrencyProvider().GetAll();
    }
    else
    {
        Validation validation = new Validation();
        foreach (var modelState in ModelState)
            foreach (var error in modelState.Value.Errors)
                validation.Errors.Add(error.ErrorMessage);

        clientData.IsValid = false;
        clientData.Data = validation;
    }   

    return clientData;
}

当我填写validation.Errors.Add(error.ErrorMessage) 时出现问题。即使我在 global.asax.cs 中按如下方式全局完成了异常处理,它也会抛出空引用异常

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        GlobalFilters.Filters.Add(new ExceptionFilter());
    }
}

我的异常处理程序类:

public class ExceptionFilter : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        ViewResult view = new ViewResult();
        view.ViewName = "Error";
        view.ViewBag.Exception = filterContext.Exception.Message;
        filterContext.ExceptionHandled = true;
        filterContext.Result = view;
    }
}

我有我的自定义错误处理页面,但它也没有显示,当我调试时,我知道在填充字符串列表时存在空引用异常:

validation.Errors.Add(error.ErrorMessage)

填写List&lt;string&gt; 时我做错了什么,为什么会抛出空引用异常?为什么那个空引用异常没有出现在我的自定义错误页面上?

【问题讨论】:

  • 尝试用这个替换你的 Foreach 错误条件:- foreach(ModelError error in modelState.Errors){ ///你的代码 }
  • 不,还是同样的问题
  • 您是否记得在执行validation.Errors.Add() 之前实例化一个新的List?我认为 null ref 是validation.Errors
  • 没有我如何实例化它??
  • geedubb 我想你明白了!请告诉我如何实例化列表???

标签: c# asp.net asp.net-mvc asp.net-web-api asp.net-mvc-5


【解决方案1】:

问题是您尚未在 Validation 类中创建List&lt;string&gt; 的实例。您可以通过在类构造函数中初始化实例来做到这一点。

public class Validation
{
    public Validation()
    {
         this.Errors = new List<string>();
    }

    public List<string> Errors { get; set; }
}

【讨论】:

  • 此关键字不是必需的
【解决方案2】:

您需要先实例化一个新的List&lt;string&gt;,然后再使用validation.Errors.Add() 添加到列表。

你可以试试:

public object Post(Currency currency)
{
    ClientData clientData = new ClientData();
    validation.Errors = new List<string>(); // instantiate
    if (ModelState.IsValid)
    {
        new CurrencyProvider().Insert(currency);
        clientData.IsValid = true;
        clientData.Data = new CurrencyProvider().GetAll();
    }
    else
    {
        Validation validation = new Validation();
        foreach (var modelState in ModelState)
        {
            foreach (var error in modelState.Value.Errors)
            {
                validation.Errors.Add(error.ErrorMessage);
            }
        }
        clientData.IsValid = false;
        clientData.Data = validation;
    }
    return clientData;
}

【讨论】:

    【解决方案3】:

    试试

    Validation validation = new Validation();
    validation.Errors validationError = new List<string>();
    

    然后写入foreach循环:

    validationError.Add(error.ErrorMessage);
    

    【讨论】:

      【解决方案4】:

      在面向对象编程中,您基本上所做的称为“组合”或“具有”类之间的关系,类之间的组合关系意味着类在内部“具有”另一个类。 例如: 考虑下面的客户类

        public class Customer 
          {
             public Address HomeAddress { get; set; } //'Composition' or 'has a' Relation
              public string FirstName { get; set; }
              public string LastName { get; set; }
              public string EMail { get; set; }
              ...........
      
          }
      

      注意:(假设 Address 类是另一个包含 AddLine1、AddLine2、City、State 等属性的类)

      现在,一旦您初始化 Customer 类的对象,该类的所有属性都将使用它的默认值进行初始化,下面将是上述类的对象的默认值

          HomeAddress = null
          FirstName = null
          LastName = null
          EMail = null
      

      所以这可能会导致运行时异常,就像您刚刚声明了“错误”属性但没有对其进行初始化的情况一样,为了使用它,您应该使用如下构造函数对其进行初始化:

      public Customer 
      {
      HomeAddress  = new Address();
      FirstName  = "";
      LastName  = "";
      EMail = "";
      }
      

      同样,您可以在类构造函数中初始化 'Errors' 属性

      【讨论】:

      • 非常感谢,您的解释很棒!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2023-02-15
      • 2017-10-09
      • 2011-09-10
      • 2018-08-12
      • 2014-07-05
      • 2012-09-14
      相关资源
      最近更新 更多