Способ узнать, какая кнопка отправляет страницу?
У меня есть функция, связанная с ClientScript.RegisterOnSubmitStatement, которая отображает диалоговое окно JQuery UI во время обновления UpdatePanel (для обновления требуется некоторое время). На странице 2 кнопки, и я хотел бы отображать различный текст в диалоговом окне в зависимости от того, какая кнопка нажата. Есть ли способ сделать что-то вроде этого:
ServerSide
ClientScript.RegisterOnSubmitStatement(this.GetType(), "ShowSplashScreen", "ShowSplashScreen(this)");
Сторона клиента
function ShowSplashScreen(source) {
// Do stuff depending on the button that was clicked
}
В настоящее время "источником" является окно DOM, а не кнопка.
2 ответа
Вы можете использовать __EVENTTARGET
чтобы найти элемент управления, который инициировал обратную передачу:
/// <summary>
/// Retrieves the control that caused the postback.
/// </summary>
/// <param name="page"></param>
/// <returns></returns>
private Control GetControlThatCausedPostBack()
{
Control ctrl = null;
//use the event target to get the control that initiated the postback
string ctrlName = Page.Request.Params.Get("__EVENTTARGET");
if (!String.IsNullOrEmpty(ctrlName))
ctrl = Page.FindControl(ctrlName);
//return the control to the calling method
return ctrl;
}
Хорошо, я нашел обходной путь. Сначала я приведу краткое объяснение, а затем гораздо более длинное для тех, кто в будущем увидит эту страницу, потому что такие любители, как я, которые могут не знать об этом в обратном направлении, могут использовать это, чтобы получить некоторую помощь. (Потому что я живу в поисках этого материала.)
Функцией, которую я искал, было наличие модального div с различным innerHTML в зависимости от того, какая кнопка была нажата. Я также хотел, чтобы div отображался только в том случае, если страница действительна, и не все кнопки на странице вызывают проверку.
Тренировкой было создать глобальную переменную "ButtonClicked". Затем для КАЖДОЙ кнопки на странице должен быть назначен javascript ее атрибуту onclick, который устанавливает переменную ButtonClicked в качестве идентификатора кнопки. Сценарий, назначенный для onclick, запускается ДО проверки страницы. Затем, используя ClientScript.RegisterOnSubmitStatement, я назначил функцию, которая будет вызываться после успешной проверки страницы, но непосредственно перед фактической отправкой страницы. Затем я могу получить доступ к событию "ButtonClicked", чтобы увидеть, какая кнопка была только что вызвана, и затем изменить innerHTML модального div, а затем отобразить его. (Затем выполните обратную передачу asyc, затем удалите модальный div после обратной передачи.)
Почему я не могу просто установить innerHTML модального div из функций, которые сами кнопки вызывают? Потому что innerHTML, который я помещаю туда, зависит от того, является ли страница действительной, и я знаю только, является ли страница действительной, когда я получаю функцию ShowSplashScreen. Вы также можете спросить, почему я не просто вызываю страницу для проверки из функции javascript, которую вызывает кнопка. Это происходит потому, что выполнение этого вызывает двойной вызов проверки, и на странице так много информации, что для проверки страницы требуется почти полная секунда, и потому что сама функция проверки на стороне клиента содержит некоторые вещи, которые можно вызывать ТОЛЬКО один раз во время проверки.
Таким образом, конечным результатом всего этого является то, что function1 и function 2 вызываются своими соответствующими кнопками при нажатии ДО проверки, а ShowSplashScreen вызывается любой кнопкой ПОСЛЕ проверки (только если страница действительна), и затем я получаю доступ к глобальной переменной чтобы увидеть, какая из них была нажата.
Так что все это будет выглядеть так:
HTML
<!-- This is a simplified version of the HTML that <asp:Button> is going to
output in the actual HTML -->
<input type="submit" id="Button1" value="Load Page" onclick="function1(this)">
<input type="submit" id="Button2" value="Save Page" onclick="function2(this)">
JavaScript
var ButtonClicked = ""; //Needs to be global
//It is not necessary to have a different function for each button,
//I just needed to for the needs of my page. If Button2 calls function1
//instead of function2, ButtonClicked is still set to "Button2".
//It is very important that EVERY button on the page calls something
//that sets ButtonClicked or you will get an bug if the user ever
//clicks a button that sets ButtonClicked, and then clicks a button
//that does not set ButtonClicked (the final function will still
//think that the first button had just been clicked)
function function1(source){
ButtonClicked = source.id;
//whatever else Client Script that needs to be run from this button
}
function function2(source){
ButtonClicked = source.id;
//whatever else Clinet Script that needs to be run from this button
}
function ShowSplashScreen(){
if(ButtonClicked == "Button1")
//Use JQuery to access the dialog <div> and set the innerHTML
//to whatever
else if(ButtonClicked == "Button2")
//Use JQuery to access the dialog <div> and set the innerHTML
//to something else
}
ServerSide
//Use this code to set a function to be called after the page has
//been successfully validated. If a button does not cause validation,
//then that button will always call the function set here
//
//You should also check to see if the script has already been registered
//for speed purposes, but I'm just demonstrating particular
//functionality here.
protected void Page_Load(object sender, EventArgs e)
{
ClientScript.RegisterOnSubmitStatement(this.GetType(), "ShowSplashScreen",
"ShowSplashScreen()");
}