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;
}
}
您没有全局对象的实例,这些实例在发回之前被实例化。在Button1_Click
现在你会期望收集保存数据之间的post回,但你不会得到它,直到你存储它的一些地方,如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();
}
}
问题是为每个请求重新创建page-object。因此,每次调用都会重新初始化页面级字段。而回发只是另一个请求!
如果你想在请求之间持久化值,你需要找到一些方法来存储这些值。
- 在一个真实的数据库中,需要一些工作,但你有完全的控制和完全的持久性
- 在缓存或应用程序中,用于应用程序范围的存储,每个访问者获得相同的值,但这些值在应用程序回收时丢失。
- 在会话中,对于用户特定的存储,只要会话不超时(和应用程序不回收)
- 在ViewState中,对于"特定于回发"的存储:这将通过回发保存值到同一页面(特定于用户),但当用户转到另一个页面时丢失。