3

以下では、無関係なコードを取り出しました。というフィールドを作成しましたprintString。このcalculateButton_Clickメソッドは大量の処理を実行するので、response.write. ただし、printString変数が「DEFAULT」になることは決してないようです。をクリックすると、空白のページに表示されるのは DEFAULT だけですprintButton_Click。以下のトリミングされたコード:

    public partial class _Default : System.Web.UI.Page
    {
        private string _printString = "DEFAULT";

        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Buffer = true;
        }

        protected void calculateButton_Click(object sender, EventArgs e)
        {
            _printString = "";

_printString = "HARRY POTTER™: THE EXHIBITION Invoice<BR>Today's date: " + DateTime.Today.ToString("dd/MM/yyyy") + "<BR>Visit date: " +
            dateSelectedString + "<BR><BR><BR>Adult tickets: " + numAdult + "<BR>Child tickets: " + numChild + "<BR>Family Passes: " + numFamily +
            "<BR>Payment method: " + paymentType + "<BR>Total to pay: $" + totalPrice.ToString("0.00");

    }

    protected void printButton_Click(object sender, EventArgs e)
    {
        Response.Clear();
        Response.Write(_printString);
        Response.Flush();
        Response.End();
    }
}
4

3 に答える 3

2

HTTP は (コントロールも含めて) ステートレスであるため、すべての (インスタンス) 変数はページのライフサイクルの最後に破棄されます。ViewState代わりに、HiddenFieldまたはSession変数を使用できます。

private string PrintString 
{
    get
    {
        if (ViewState["PrintString "] == null || string.IsNullOrEmpty((String)ViewState["PrintString"]))
        {
            ViewState["PrintString"] = "DEFAULT";
        }
        return ViewState["PrintString"].ToString();
    }
    set { ViewState["PrintString"] = value; }
}

他にも次のオプションがあります。

ASP.NET アプリケーションで永続的なユーザー状態を管理するための 9 つのオプション

于 2013-04-08T11:42:18.670 に答える
2

printButton をクリックするとDEFAULT、変数が設定されているときの値が使用されます。

private string _printString = "DEFAULT";

あなたの問題です。printString変数が変更されたときの状態を維持する必要があります。_printString単純に別の値を代入するだけでは、変更は保持されません。_printStringがクリックされたときに正しい値に割り当てる関数を作成するか、以下に示すようにクリック関数で _printString を直接printButton使用ViewStateまたは割り当てることができます。SessionprintButton

protected void printButton_Click(object sender, EventArgs e)
{
    _printString = "Harry Potter";

    Response.Clear();
    Response.Write(_printString);
    Response.Flush();
    Response.End();
}

ページに書き込まれますHarry Potter

使用するにはSession

protected void calculateButton_Click(object sender, EventArgs e)
{
       _printString = "HARRY POTTER™: THE EXHIBITION Invoice<BR>Today's date: " + DateTime.Today.ToString("dd/MM/yyyy") + "<BR>Visit date: " +
        dateSelectedString + "<BR><BR><BR>Adult tickets: " + numAdult + "<BR>Child tickets: " + numChild + "<BR>Family Passes: " + numFamily +
        "<BR>Payment method: " + paymentType + "<BR>Total to pay: $" + totalPrice.ToString("0.00");

       Session["PrintString"] = _printString;
}

protected void printButton_Click(object sender, EventArgs e)
{
    _printString = (string)Session["PrintString"];

    Response.Clear();
    Response.Write(_printString);
    Response.Flush();
    Response.End();
}

ビューステート:

ViewState["PrintString"] = "HarryPotter";

次に、値を取得するには、次のようにします。

 _printString = (string)ViewState["PrintString"];

http://msdn.microsoft.com/en-gb/library/ms972976.aspx

于 2013-04-08T11:38:04.210 に答える
1

ボタン クリック イベントが原因でポストバックが発生し、_printString値が保持されていません。セッションまたはビューステートを介して計算メソッドに保存し、次に印刷に設定する必要があります。例: -

 protected void calculateButton_Click(object sender, EventArgs e)
 {
     _printString = "";
     _printString = "HARRY POTTER™: THE EXHIBITION Invoice<BR>Today's date: " + DateTime.Today.ToString("dd/MM/yyyy") + "<BR>Visit date: " +
        dateSelectedString + "<BR><BR><BR>Adult tickets: " + numAdult + "<BR>Child tickets: " + numChild + "<BR>Family Passes: " + numFamily +
        "<BR>Payment method: " + paymentType + "<BR>Total to pay: $" + totalPrice.ToString("0.00");
     Session["bigstring"] = _printString;
 }

 protected void printButton_Click(object sender, EventArgs e)
 {
     Response.Clear();
     _printString = Session["bigstring"].ToString();
     Response.Write(_printString);
     Response.Flush();
     Response.End();
 }
于 2013-04-08T11:45:39.240 に答える