Получение значений из DropDownList при обратной передаче в asp.net
У меня странная проблема с обратной передачей DropDownList.
У меня есть DropDownList на главной странице asp.net, которая содержит некоторые имена состояний, такие как:
- Текст [NewYork] - Значение [0]
- Текст [Нью-Джерси] - Значение [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;
}
}
Теперь я хочу получить значение Globals.DefaultTown на странице содержимого (Default.aspx). Я делаю это, как показано ниже:
Response.Write("Default Town Is: " + Globals.DefaultTown + "<br />");
Теперь всякий раз, когда я выбираю состояние из выпадающего списка, Globals.DefaultTown не обновляется сразу, как по умолчанию для выбранного состояния установлено значение DefaultTown, но когда я выбираю второе состояние из списка, он по-прежнему дает идентификатор первого состояния, теперь когда я выбираю третье состояние из списка, он дает идентификатор второго, а когда я выбираю первое состояние из списка, он дает идентификатор третьего состояния, то есть он не обновляет переменную DefaultTown на месте.
Может кто-нибудь сказать мне, что будет не так для этого
1 ответ
Это нормальное поведение. Когда вы выбираете элемент выпадающего списка, он отправляет обратно, сначала загружает страницу контента, запускает:
Response.Write("Default Town Is: " + Globals.DefaultTown + "<br />");
Здесь Globals.DefaultTown еще не изменился.
Затем он переходит к методу rpTowns_SelectedIndexChanged и изменяет Globals.DefaultTown.
Эта страница может помочь лучше понять: События в ASP.NET Master и 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 />");
}