0

私は当惑しています。おそらく、pageLoad、IsPostBack、または IsCallback のプロパティに精通しているだけかもしれません。「 first 」というブール変数を作成し、それをTrueに設定しました。初めて PageLoad を使用すると、first = Falseの場合はコード行があり、そうであればwrite = trueです。次に、Run_write ルーチンをボタンにアタッチし、実行時にユーザーが最初の質問に「はい」と答えた場合、ラジオ ボタンの別のグループを表示し、最初に falseに設定します。(私はこれをデバッグで実行しましたが、このコード行にヒットすることはわかっています) ... write == false であるため、sql への書き込みは無視され 、新しいボタンのセットでウィンドウが再表示されます... すばらしい!

さらに、PageLoad ルーチンを再度実行すると、if (!first), set write を TRUE に設定する行にヒットします。私の問題は最初にtrueにリセットされましたか? 私は何が欠けていますか?新しいボタンのセットがチェックされているかどうかを利用することでこれを回避できましたが、このルートには行きたくないかもしれません。何が起こっているのかを理解したいと思います。

コードは以下です。

namespace MEAU.Web.Components.SupportCenter
{
    public partial class feedback : System.Web.UI.Page
    {
        String login;
        String myurl;
        String response;
        String s_call;
        String p_ship;
        String wrnty;
        Boolean write;
        Boolean first = true;

        protected void Page_Load(object sender, EventArgs e)
        {
            login = Sitecore.Security.Accounts.User.Current.Profile.Email;
            myurl = Request.QueryString["value"];
            s_call = "No";
            p_ship = "No";
            wrnty = "No";
            // Hide the question Buttons
            scall.Visible = false;
            parts.Visible = false;
            wrnt.Visible = false;
            lit.Visible = false;
            write = false;
            if (!first)
                write = true;
        }

        protected void Run_Write(object sender, EventArgs e)
        {
            // Get Reponse
            if (yes.Checked)
            {
                response = "Yes";
                // Display the quesiton buttons, and Hide the NO button
                scall.Visible = true;
                parts.Visible = true;
                wrnt.Visible = true;
                lit.Visible = true;
                no.Visible = false;
                first = false;

                // Did this Prevent a Service call?
                if (scall.Checked)
                {
                    s_call = "Yes";
                    write = true;
                }

                // Did this Prevent a parts shipment?
                if (parts.Checked)
                {
                    p_ship = "Yes";
                    write = true;
                }

                // Is this under warranty?
                if (wrnt.Checked)
                {
                    wrnty = "Yes";
                    write = true;
                }                    
            //   write = true;
            }
            if (no.Checked)
            {
                response = "No";
                write = true;
            }

            if (write == true)
            {
                SqlConnection conn = new SqlConnection(Sitecore.Configuration.Settings.GetConnectionString("feedback"));
                SqlCommand cmd = new SqlCommand("Insert_fb", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@login", login);
                cmd.Parameters.AddWithValue("@url", myurl);
                cmd.Parameters.AddWithValue("@response", response);
                cmd.Parameters.AddWithValue("@dateTime", DateTime.Now);
                cmd.Parameters.AddWithValue("@serviceCall", s_call);
                cmd.Parameters.AddWithValue("@partsShipment", p_ship);
                cmd.Parameters.AddWithValue("@warranty", wrnty);

                try
                {
                    conn.Open();
                    cmd.ExecuteNonQuery();
                    Response.Write("<script type='text/javascript'>parent.$.fancybox.close();</script>");
                    Response.Write("<script type='text/javascript'>return false;</script>");    
                }
                catch (Exception ex)
                {
                    throw new Exception("Error on file update" + ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
}
4

6 に答える 6

1

サイトへの HTTP リクエストごとに、ページ クラスの新しいインスタンスが作成されます。
インスタンスの状態は保持されません。

代わりに、適用する対象に応じて、セッションまたは ViewState に状態を保存する必要があります。

于 2013-06-05T20:28:08.347 に答える
0

コントロールの状態または値を維持できる方法がいくつかあるため、チェックとしてポストバックではなくコントロールのビューステートを維持しています。

(!IspostBack) // means when page loads first time

そして、else に書かれていることは、オブジェクトのビューステートを維持できるポストバックが発生したときを意味します。

また、Viewstate が使用されていない場合は、セッションを使用できます。

于 2013-06-05T20:35:36.717 に答える
0

Page_Loadサーバーがページをリクエストするたびに呼び出されます。これにはポストバックが含まれます。

IsPostBack現在の Page_Load の実行がページの最初の表示用であるか、またはその後のポストバック用であるかを確認できます。

protected void Page_Load(object sender, EventArgs e)
{
  if (this.IsPostBack)
  {
    // Do first-time things
  }
  else
  {
    // Do non-first-time things
  }
}

ページ オブジェクトの特定のインスタンスは、アクセスからアクセスへと持続しないことに注意してください。そのため、ページが呼び出されるたびに初期化する必要がある情報がいくつかある場合があります。

于 2013-06-05T20:32:52.153 に答える
0

ページにアクセスするたびに、クラスの新しいインスタンスを作成しています。

ページの読み込みと、ユーザーがボタンをクリックしたときと、ユーザーが初めてページにアクセスしたときとを区別するには、IsPostBack プロパティを確認する必要があります。

したがって、次の行に沿ってifを書き直してください

// Code that always executes

if (IsPostBack)
{
    // Code that only executes on initial page load
}
else
{
    // Code that only executes when a postback event occurs
    // e.g. A user clicks on a button.
}
于 2013-06-05T20:33:03.590 に答える
0

ここでの答えは良いですが、技術的です。何が起こっているのかを少し説明しようと思います。

ブラウザがページをリクエストすると、サーバー上でクラスの新しいインスタンスが作成されます。

ASP.NET は、page_load から始めて、ページの残りの部分を実行します。これにより、他のすべての関数が呼び出され、リクエストへの応答として HTML がレンダリングされ、ブラウザに返されます。これを切断された環境として説明したいと思います。応答が送信されると、ある意味ですべてが破棄されます。あなたの変数、以前の仕事などはすべてなくなりました。サーバーに関する限り、ブラウザーから再び何かを取得することを期待することはありません...その仕事は完了しました。ページのリクエストを受け取り、結果を作成してブラウザに送り返しました。終わり。

したがって、コードは呼び出されるたびに新しいリクエストと考えてください。

ThatBlairGuy が述べたように IsPostback を使用できます。これは、ブラウザーからのポストバックに応答している場合は true を返すためです。つまり、以前のポストバックでブラウザーにこのページを既に提供していることを意味します。

于 2013-06-05T20:48:07.000 に答える