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 на главной странице.