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 不会立即更新,就像默认情况下为 DefaultTown 设置的 Selected State 一样,但是当我从列表中选择第二个状态时,它仍然给出第一个状态的 id,现在当我从列表中选择第三个状态时,它会给出第二个状态的 id,当我从列表中选择第一个状态时,它会给出第三个状态的 id,即它不会当场更新 DefaultTown 变量。

谁能告诉我这会出什么问题

4

1 回答 1

1

这是正常行为。当您选择下拉列表项时,它会回发,首先加载内容页面,然后运行:

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

这里 Globals.DefaultTown 还没有改变。

然后它转到 rpTowns_SelectedIndexChanged 方法并更改 Globals.DefaultTown。

此页面可能有助于更好地理解:ASP.NET Master and Content Pages 中的事件

解决方案:

1.如果没有副作用,可以将代码移到Masterpage:

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 回答