ViewState, UserControl и IsPostback

По сути, у меня есть раскрывающийся список и динамически добавляемый пользовательский элемент управления. Пользовательский элемент управления загружает сетку в зависимости от выбора, сделанного в раскрывающемся списке. Выпадающий список не является частью пользовательского элемента управления.

Теперь вопрос в том, как имитировать (isControlPostback = false) каждый раз, когда пользователь изменяет выбор в раскрывающемся списке? Похоже, ViewState запоминает элемент управления.

Внутри моего пользовательского элемента управления у меня есть:

protected bool IsUserControlPostBack
{
    get
    {
        return this.ViewState["IsUserControlPostBack"] != null;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsUserControlPostBack)
    {
        ViewState.Add("IsUserControlPostBack", true);
        //load stuff in the grid view and bind it
    }
}

Когда пользователь изменяет выбор в раскрывающемся списке, у меня появляется окно подтверждения javascript, и страница отправляется обратно. Таким образом, событие OnSelectedIndexChanged для раскрывающегося списка не запускается. Я хотел бы удалить, чтобы делать что-то подобное каждый раз при изменении выбранного индекса: ViewState.Remove ("IsUserControlPostBack");

Ответов (4)

Решение

Для всех, кому интересно узнать ответ: в итоге я реализовал общедоступное свойство внутри пользовательского элемента управления и загрузил элемент управления в событие SelectedIndexChanged, а не OnInit, в раскрывающемся списке сервера. Это устранило необходимость явного использования Viewstate.

Добавьте элемент управления на страницу незадолго до OnLoad. Например, OnInit. Между OnInit и OnLoad загружается состояние просмотра и запускаются события обратной передачи.

Вы можете вносить изменения в элемент управления в событии предварительной визуализации. Когда это событие запускается, выполняются все остальные действия. Или вы можете сделать общедоступное свойство в пользовательском элементе управления и при настройке, требующей значения, реагировать соответствующим образом.

ViewState, к которому вы обращаетесь в своем пользовательском элементе управления, отличается от того, к которому вы обращаетесь на странице. Если вам нужно, чтобы ваша страница взаимодействовала с вашим пользовательским элементом управления, я предлагаю вам добавить для этой цели общедоступный метод в свой пользовательский элемент управления.

Если по какой-то причине вы предпочитаете что-то похожее на ваш подход ViewState, вы можете попробовать Context.Items. Обратите внимание, что Context.Items не сохраняется между запросами.