簡體   English   中英

將字符串添加到字符串列表

[英]Add strings to the list of string

我正在嘗試填充字符串列表,但它會引發null引用異常。

碼:

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

我有我的自定義錯誤處理頁面,但也未顯示,當我進行調試時,我才知道在填充字符串列表時存在null引用異常:

validation.Errors.Add(error.ErrorMessage)

填充List<string>時,我在做什么錯?為什么拋出null引用異常? 以及為什么該空引用異常不會出現在我的自定義錯誤頁面上?

問題是您尚未在Validation類中創建List<string>的實例。 您可以通過在類構造函數中初始化實例來實現。

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

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

您需要實例化一個新的List<string>然后再添加帶有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;
}

嘗試

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

然后寫入foreach循環:

validationError.Add(error.ErrorMessage);

在面向對象的編程中,您基本要做的就是稱為“組成”或“具有一個”類之間的關系,類之間的構成關系意味着內部該類“具有”另一個類。 例如:考慮下面的客戶類別

  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'屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM