1

DropDownList ポストバックに奇妙な問題があります。

asp.net マスター ページに DropDownList があり、次のような状態名が含まれています。

  1. テキスト [ニューヨーク] - 値 [0]
  2. テキスト [ニュージャージー] - 値 [1]

drpTowns.DataSource = objTown.GetAllStates();
drpTowns.DataTextField = "Name";
drpTowns.DataValueField = "Id";
drpTowns.DataBind();

マスター ページのコード ビハインドには、DropDownList_SelectedIndexChanged イベントがあり、セッションを保持している変数にドロップダウン リストの SelectedValue を設定しています。以下のように

protected void drpTowns_SelectedIndexChanged(object sender, EventArgs e)
{
    Globals.DefaultTown = Convert.ToInt32(drpTowns.SelectedValue);
}

Globals.DefaultTown の定義は、以下のように App_Code Globals.cs クラスに記述されます。

 private static int _defaultTown = Convert.ToInt32(ConfigurationManager.AppSettings["DefaultTown"]);

public static int DefaultTown
{
    get
    {
        if (HttpContext.Current.Session["DefaultTown"] == null)
            return _defaultTown;
        else
            return Convert.ToInt32(HttpContext.Current.Session["DefaultTown"]);
    }
    set
    {
        HttpContext.Current.Session["DefaultTown"] = value;
    }
}

ここで、コンテンツ ページ (Default.aspx) の Globals.DefaultTown の値を取得したいと考えています。私は以下のようにしています:

Response.Write("Default Town Is: " + Globals.DefaultTown + "<br />");

ドロップダウンリストから州を選択するたびに、Globals.DefaultTown はすぐに更新されません。デフォルトでは、Selected State が DefaultTown に設定されていますが、リストから 2 番目の州を選択すると、最初の州の ID が表示されます。リストから 3 番目の州を選択すると、2 番目の州の ID が返され、リストから最初の州を選択すると、3 番目の州の ID が返されます。つまり、その場で DefaultTown 変数を更新しません。

誰でもこれで何がうまくいかないのか教えてもらえますか

4

1 に答える 1

1

これは正常な動作です。ドロップダウンリスト アイテムを選択すると、ポスト バックされ、最初にコンテンツ ページが読み込まれ、実行されます。

Response.Write("Default Town Is: " + Globals.DefaultTown + "<br />");

ここで Globals.DefaultTown はまだ変更されていません。

次に、rpTowns_SelectedIndexChanged メソッドに移動し、Globals.DefaultTown を変更します。

このページは、理解を深めるのに役立つ場合があります: ASP.NET マスターおよびコンテンツ ページのイベント

解決:

1.副作用がない場合は、コードをマスターページに移動できます。

protected void drpTowns_SelectedIndexChanged(object sender, EventArgs e)
{
    Globals.DefaultTown = Convert.ToInt32(drpTowns.SelectedValue);
    Response.Write("Default Town Is: " + Globals.DefaultTown + "<br />");
}

2.または、同じページにリダイレクトできます。マスターページで:

protected void drpTowns_SelectedIndexChanged(object sender, EventArgs e)
{
    Globals.DefaultTown = Convert.ToInt32(drpTowns.SelectedValue);
    Response.Redirect(Request.RawUrl);
}

コンテンツ ページ:

if (!IsPostBack)
{
    Response.Write("Default Town Is: " + Globals.DefaultTown + "<br />");
}
于 2013-09-15T16:40:22.257 に答える