【问题标题】:NullReferenceException error in ASP.NetASP.Net 中的 NullReferenceException 错误
【发布时间】:2013-01-15 10:16:36
【问题描述】:

在下面的代码中,我在使用"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;
        }

    }

【问题讨论】:

    标签: c# asp.net class oop nullreferenceexception


    【解决方案1】:

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

    现在您可能希望该集合在回发之间保存数据,但直到您将其存储在 databasefilessessionviewstatecache 之类的位置才能获取数据。不过,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();
    }
    

    【讨论】:

    • 但是这样一来,您将永远不会得到比单个“dss”名称更多的信息,因为每次调用都会重新创建“NameDB”。
    • 谢谢阿迪尔,你能告诉我它在静态的情况下是如何工作的吗?如果“静态 NameDB 名称”有效。
    • 我知道所有用户的静态集合都是一样的。我想知道在WEB的情况下静态如何保存在内存中。
    • 可以使用缓存,但要注意需要存储的数据大小,msdn.microsoft.com/en-us/library/6hbbsfk6(v=vs.100).aspx
    【解决方案2】:

    替换这个:

    NameDB Names; //Creating Object
    

    通过这个

    NameDB Names = new NameDB(); //Creating Object
    

    【讨论】:

      【解决方案3】:

      您可以执行以下任何操作

      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();
          }
      }
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-17
          • 1970-01-01
          相关资源
          最近更新 更多