Если вы не хотите расширять исходный класс UpdatePanel, вы также можете использовать этот обходной путь:
string id = ScriptManager.GetCurrent(Page).AsyncPostBackSourceElementID;
Таким образом, вы можете проверить полученный идентификатор и добавить несколько условных предложений, чтобы определить, какой код должен выполняться. Этот идентификатор должен быть равен первому параметру, который был передан через функцию javascript __doPostBack('someid', '')
.
Например, у меня есть пользовательский элемент управления на панели обновлений: этот элемент управления содержит несколько кнопок ссылок, которые запускают панель обновления.) Я также могу вручную обновить эту панель из некоторых внешних ссылок (используя что-то вроде __doPostBack('myUpdatePanelClientId', '');
* 1008). *
То есть в моем случае я вижу три разных способа загрузки моей UpdatePanel:
- Загрузка первой страницы;
- Кнопка ссылки (или кнопка любого другого типа) нажата внутри моей панели обновления;
- PostBack запущен за пределами панели обновления.
Каждый сценарий дает мне другой идентификатор. Первый дает мне пустую строку (так как это первая загрузка страницы, еще не было ни одной обратной передачи, вызванной функцией __doPostBack.)
Второй дает мне уникальный идентификатор кнопки, которая была нажата внутри пользовательского элемента управления (это исходное и ожидаемое поведение ASP.NET.)
Третий дает мне именно то, что я передал в качестве первого аргумента, когда я кодировал метод (то есть: ClientId UpdatePanel.)
Вот как мне удалось реализовать мой вариант использования UpdatePanel (при условии, что я использую режим частичного рендеринга). Это не идеально, но работает как задумано.
protected void myUpdatePanel_Load(object sender, EventArgs e)
{
string id = ScriptManager.GetCurrent(Page).AsyncPostBackSourceElementID;
bool firstLoad = (String.IsNullOrEmpty(id));
bool triggerFromUpdatePanel = !firstLoad && (id.Contains(userControlInsideMyUpdatePanel.UniqueID));
bool triggerFromExternalControl = !firstLoad && (id == myUpdatePanel.ClientID);
// case 1, 2, 3.
if ((firstLoad) || (triggerFromUpdatePanel) || (triggerFromExternalControl ))
{
// do something
}
else
{
// do nothing!
}
}