[英]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
再次实例化该对象
现在,您期望该集合在回发之间保存数据,但是直到将其存储在某些地方(如database
, files
, session
, viewstate
或数据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();
}
}
问题在于将为每个请求重新创建页面对象。 因此,每次调用都会重新初始化页面级字段。 而回发只是另一个请求!
如果要在请求之间保留值,则需要找到某种方式来存储它们。 一些选项是:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.