ASP.NET DropDownList не сохраняет выбранный элемент при обратной передаче
У меня есть ASP DropDownList, который заполняется событием Page_Load, после того, как я выбираю элемент и нажимаю кнопку, выбранный элемент очищается и выбирается первый элемент в DropDownList. (DropDownList заполняется только тогда, когда страница не является обратной передачей)
Помогите пожалуйста
if (!IsPostBack)
{
List<Country> lCountries = new List<Country>();
List<CompanySchedule> lCompanySchedules = new List<CompanySchedule>();
this.Load_Countries(lCountries);
this.Load_Schedules(lCompanySchedules);
if (personnelRec == null)
{ personnelRec = new Personnel(); }
if (Request.QueryString["UA"] != null && Convert.ToInt32(Request.QueryString["UA"].ToString()) > 0)
{
userAccount.ID = Convert.ToInt32(Request.QueryString["UA"].ToString());
App_Database.Snapshift_Select_Helper.SNAPSHIFT_SELECT_PERSONNEL_APP_ACCOUNT(ref userAccount);
}
this.imgEmployeePicture.ImageUrl = "./images/Employees/nophoto.gif";
if (Request.QueryString["EI"] != null && Convert.ToInt32(Request.QueryString["EI"].ToString()) > 0)
{
this.Load_PersonnelRec(Convert.ToInt32(Request.QueryString["EI"].ToString()));
}
else
{
this.lblChangeDirectionHead.Enabled = false;
this.lblChangeDirections.Enabled = false;
this.lbSchedules.Disabled = true;
}
}
Ответы
Ответ 1
Жизненный цикл страницы выполняет следующие действия (плюс другие шаги, не относящиеся к вашему вопросу):
-
OnInit
- Заполнение элементов управления ViewState (во время обратной передачи)
- Задайте выбранные значения (во время обратной передачи)
-
Page_Load
Вам нужно включить ViewState, чтобы он мог заполнить список, прежде чем он "выбирает" элемент. В этом случае убедитесь, что вы не заселяетесь в Page_Load и не теряете выбранное значение. Сделайте что-то вроде if (!IsPostback) { // Populate }
В противном случае вам нужно заполнить список вручную в событии OnInit
для каждого запроса страницы. Page_Load
слишком поздно в жизненном цикле, поэтому выбранный элемент потерян.
Edit:
В параметре DropDownList
также должны быть установлены допустимые значения (отдельно от текста, отображаемого в браузере). Это делается с помощью свойства DataValueField
. Каждое значение должно быть уникальным, иначе будет выбран только первый дублирующий элемент. Если вы посмотрите на источник HTML в своем браузере, вы должны иметь:
<select>
<option value="unique_value1">Displayed text1</option>
<option value="unique_value2">Displayed text2</option>
</select>
Уникальные значения используются для выбора нужного элемента на стороне сервера.
Ответ 2
Используете ли вы мастер-страницу? Если это так, не забудьте поставить EnableViewState на true на главной странице.