簡體   English   中英

ASP.Net中的NullReferenceException錯誤

[英]NullReferenceException error in ASP.Net

在下面的代碼中,使用"Names.Add(string)"方法時出現Null Reference Exception錯誤。 但是,當我使用靜態類或NamedDB類的靜態對象時,它可以正常工作。 誰能解釋一下對象實例在ASP.Net Web應用程序中如何工作? 為什么在靜態對象正常工作的情況下在非靜態對象中出現錯誤?

public partial class _Default : System.Web.UI.Page
{

   NameDB Names; //Creating Object

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Names = new NameDB();//Instantiation
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {

        Names.Add("dss");//Object Reference is null

        GridView1.DataSource = Names.GetName();
        GridView1.DataBind();
    }
}


    //NamedDB class

    public class NameDB
    {
        List<string> Names=new List<string>();

        public void Add(string item)
        {
            Names.Add(item);
        }

        public string Remove(string item)
        {

            Names.Remove(item);
            return item;
        }

        public List<string> GetName()
        {

            return Names;
        }

    }

您沒有在回發之前實例化的全局對象實例。 Button1_Click再次實例化該對象

現在,您期望該集合在回發之間保存數據,但是直到將其存儲在某些地方(如databasefilessessionviewstate或數據cache ,您才會得到它。 不過,Session和ViewState並不用於存儲該類型的數據。

protected void Button1_Click(object sender, EventArgs e)
{
    Names = new NameDB();//Instantiation
    Names.Add("dss");//Object Reference is null
    GridView1.DataSource = Names.GetName();
    GridView1.DataBind();
}

替換為:

NameDB Names; //Creating Object

這樣

NameDB Names = new NameDB(); //Creating Object

您可以執行以下任何一項

public partial class _Default : System.Web.UI.Page
{
   NameDB Names= new NameDB();//Creating Object
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {

        Names.Add("dss");

        GridView1.DataSource = Names.GetName();
        GridView1.DataBind();
    }
}

要么

public partial class _Default : System.Web.UI.Page
{
   NameDB Names;//Creating Object
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Names = new NameDB();//Instantiation
        Names.Add("dss");

        GridView1.DataSource = Names.GetName();
        GridView1.DataBind();
    }
}

問題在於將為每個請求重新創建頁面對象。 因此,每次調用都會重新初始化頁面級字段。 而回發只是另一個請求!

如果要在請求之間保留值,則需要找到某種方式來存儲它們。 一些選項是:

  • 在真實的數據庫中,需要做一些工作,但是您擁有完全的控制權和持久性
  • CacheApplication中 ,用於每個訪問者都獲得相同值的應用程序級存儲,但是在應用程序回收時這些值會丟失。
  • Session中 ,用於特定於用戶的存儲,只要會話不超時(並且應用程序不回收)
  • ViewState中 ,用於“特定於回發”的存儲:這將通過回發將值保留到同一頁面(特定於用戶),但是當用戶轉到另一個頁面時會丟失。

暫無
暫無

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

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