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

これで、コレクションがポストバックの間にデータを保持することを期待しますが、、、、、またはデータのようdatabaseな場所に保存するまで、コレクションを取得することはできません。ただし、SessionとViewStateは、そのタイプのデータを格納するためのものではありません。filessessionviewstatecache

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

問題は、リクエストごとにページオブジェクトが再作成されることです。したがって、ページレベルのフィールドは呼び出しごとに再初期化されます。そして、ポストバックは単なる別のリクエストです!

リクエスト間で値を保持したい場合は、これらを保存する方法を見つける必要があります。いくつかのオプションは次のとおりです。

  • 実際のデータベースでは、ある程度の作業が必要ですが、完全な制御と完全な永続性があります
  • キャッシュまたはアプリケーションで、すべての訪問者が同じ値を取得するアプリケーション全体のストレージの場合、これらはアプリのリサイクル時に失われます。
  • セッションでは、セッションがタイムアウトしない(そしてアプリがリサイクルされない)限り、ユーザー固有のストレージ用
  • ViewStateで、「ポストバック固有」ストレージの場合:これは、同じページ(ユーザー固有)へのポストバックを通じて値を保持しますが、ユーザーが別のページに移動すると失われます。
于 2013-01-15T10:35:44.800 に答える