ASP.Net中的NullReferenceException错误

本文关键字:错误 NullReferenceException 中的 Net ASP | 更新日期: 2023-09-27 17:53:05

在下面的代码中,我得到一个Null Reference Exception错误,而使用"Names.Add(string)"方法。但是当我使用静态类或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;
        }
    }

ASP.Net中的NullReferenceException错误

您没有全局对象的实例,这些实例在发回之前被实例化。在Button1_Click

中再次实例化对象

现在你会期望收集保存数据之间的post回,但你不会得到它,直到你存储它的一些地方,如database, files, session, viewstatecache的数据。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();
    }
}

问题是为每个请求重新创建page-object。因此,每次调用都会重新初始化页面级字段。而回发只是另一个请求!

如果你想在请求之间持久化值,你需要找到一些方法来存储这些值。

  • 在一个真实的数据库中,需要一些工作,但你有完全的控制和完全的持久性
  • 在缓存或应用程序中,用于应用程序范围的存储,每个访问者获得相同的值,但这些值在应用程序回收时丢失。
  • 在会话中,对于用户特定的存储,只要会话不超时(和应用程序不回收)
  • 在ViewState中,对于"特定于回发"的存储:这将通过回发保存值到同一页面(特定于用户),但当用户转到另一个页面时丢失。