2

次のテスト ASP ページがあります。

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
    </div>
    </form>
</body>
</html>

次のコード ビハインドを使用します。

public partial class test : System.Web.UI.Page
{

    int x = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = x.ToString();
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        x++;
        Label1.Text = x.ToString();
    }
}

Web プログラミング以外の考え方からすると、int xこれはテスト ページ クラスの一種のオブジェクト フィールドであり、x++その値はxポストバックを通じて保持されると考えていましたが、そうではないようです。では、これらのフィールドは永続性に関してどのように機能するのでしょうか? Label1.Textボタンをクリックすると、最初にクリックしたときに 1 に変更されますが、その後は 1 を超えることができないため、奇妙だと思います。

また、なぜこれが起こっているのかを理解したら、私が最初に望んでいたことを実現する最も簡単な方法は何ですか? (xポストバック間で持続する値)

これは、私が探していたビューステートを使用して今のように見えるものです:

パブリック部分クラスのテスト: System.Web.UI.Page {

//static int x = 0;



protected void Page_Load(object sender, EventArgs e)
{

    if (ViewState["x"] == null)
    {
        ViewState["x"] = 0;
        Label1.Text = ViewState["x"].ToString();
    }


    //Label1.Text = x.ToString();
}

protected void Button1_Click(object sender, EventArgs e)
{

    ViewState["x"] = Convert.ToInt32(ViewState["x"].ToString()) + 1;
    Label1.Text = ViewState["x"].ToString();
    //x++;
    //Label1.Text = x.ToString();
}

}

4

4 に答える 4

0

Jason Evans が正しく指摘したように、永続化するには値を Session に保存する必要があります。次のことができます。

  protected void Page_Load(object sender, EventArgs e)
  {
        //Label1.Text = x.ToString();
        Session["x"] = x;
  }

  protected void Button1_Click(object sender, EventArgs e)
  {
        x = Session["x"];
        x++;
        Label1.Text = x.ToString();
  }

もちろん、Cookie、ViewState、Querystring の追加など、値を永続化する方法は他にもあります。しかし、その中でも、SessionState が最も一般的に使用されています。

于 2013-08-23T18:18:07.310 に答える