将字符串添加到字符串列表中

时间:2016-01-02 11:25:25

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

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

代码:

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)时出现问题。它引发了我的null引用异常,即使我在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<string>时,我做错了什么?为什么抛出空引用异常?为什么空引用异常没有出现在我的自定义错误页面上?

4 个答案:

答案 0 :(得分:2)

问题是您尚未在Validation类中创建List<string>的实例。您可以通过在类构造函数中初始化实例来实现。

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

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

答案 1 :(得分:0)

在使用validation.Errors.Add()添加到列表之前,您需要实例化一个新的List<string>

你可以尝试:

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;
}

答案 2 :(得分:0)

<强>尝试

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

然后写入foreach循环:

validationError.Add(error.ErrorMessage);

答案 3 :(得分:0)

你基本上做的是'组合'或'有一个'面向对象编程中的类之间的关系,类之间的组合关系,意味着类'内部有一个'另一个类。 对于前: 考虑下面的客户类

  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

所以这会导致运行时异常,就像你刚刚声明'Errors'属性但没有初始化它的情况一样,为了使用它你应该使用如下构造函数初始化它:

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

所以类似地你可以在类构造函数

中初始化'Errors'属性