我正在尝试填充字符串列表,但它会抛出空引用异常。
代码:
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>
时,我做错了什么?为什么抛出空引用异常?为什么空引用异常没有出现在我的自定义错误页面上?
答案 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'属性