0

在下面的代码中,我在使用方法时遇到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;
        }

    }
4

4 回答 4

3

您没有在回发之前实例化的全局对象实例。再次实例化对象Button1_Click

现在您会期望该集合在回发之间保存数据,但直到您将其存储在某个位置(如databasefiles、或用于数据session)之前您不会得到它。Session 和 ViewState 并不意味着存储这种类型的数据。viewstatecache

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();
}
于 2013-01-15T10:18:03.283 回答
1

替换这个:

NameDB Names; //Creating Object

这样

NameDB Names = new NameDB(); //Creating Object
于 2013-01-15T10:19:07.413 回答
0

您可以执行以下任何操作

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();
    }
}
于 2013-01-15T10:22:11.153 回答
0

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

如果要在请求之间保留值,则需要找到某种方法来存储这些值。一些选项是:

  • 在真实的数据库中,需要一些工作,但您可以完全控制和完全持久化
  • CacheApplication中,用于应用程序范围的存储,其中每个访问者都获得相同的值,但在应用程序回收时这些值会丢失。
  • Session中,用于用户特定的存储,只要会话没有超时(并且应用程序不会回收)
  • ViewState中,对于“回发特定”存储:这将通过回发到同一页面(特定于用户)来保留值,但当用户转到另一个页面时会丢失。
于 2013-01-15T10:35:44.800 回答