繁体   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