在asp.net中从Postback上的DropDownList中检索值

时间:2013-09-15 16:25:52

标签: asp.net master-pages static-variables autopostback content-pages

我对DropDownList回发有一个奇怪的问题。

我在asp.net母版页中有一个DropDownList,它包含一些状态名称,如:

  1. 文字[NewYork] - 价值[0]
  2. 文字[新泽西] - 价值[1]
  3. 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变量

    任何人都可以告诉我这个

    会出现什么问题

1 个答案:

答案 0 :(得分:1)

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

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

此处Globals.DefaultTown尚未改变。

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

此页面可能有助于更好地理解:Events in ASP.NET Master and Content Pages

解决方案:

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 />");
}