【问题标题】:Retrieving values from DropDownList on Postback in asp.net在 asp.net 中的 Postback 上从 DropDownList 中检索值
【发布时间】:2013-09-15 16:25:51
【问题描述】:

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

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

  1. 文本 [NewYork] - 值 [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 设置选定状态一样,但是当我从列表中选择第二个状态时,它仍然给出第一个的 id状态,现在当我从列表中选择第三个状态时,它会给出第二个状态的 id,当我从列表中选择第一个状态时,它会给出第三个状态的 id,即它不会当场更新 DefaultTown 变量.

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

【问题讨论】:

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


    【解决方案1】:

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

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

    这里 Globals.DefaultTown 还没有改变。

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

    此页面可能有助于更好地理解:Events in 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 />");
    }
    

    【讨论】:

    • 嗨@afzalulh你能告诉我可能的解决方案吗?
    • 嗨@afzalulh 感谢您及时回复答案,对于您的第一个解决方案,我已经在母版页中拥有 selectedindex_changed 事件。您是否打算转到内容页面
    • 不,我的意思是将Response.Write("Default Town Is: " + Globals.DefaultTown + "&lt;br /&gt;"); 行添加到母版页中的方法中。我知道这不是很方便,因为您可能还需要在内容页面级别做其他事情。如果您在母版页中实现它,您将强制所有内容页面使用它,这不适用于所有情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2019-10-06
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多