Способ узнать, какая кнопка отправляет страницу? - PullRequest
2 голосов
/ 23 ноября 2011

У меня есть функция, связанная с ClientScript.RegisterOnSubmitStatement, которая отображает диалоговое окно JQuery UI во время обновления UpdatePanel (для обновления требуется некоторое время). На странице 2 кнопки, и я хотел бы отображать различный текст в диалоговом окне в зависимости от того, какая кнопка нажата. Есть ли способ сделать что-то вроде этого:

ServerSide

ClientScript.RegisterOnSubmitStatement(this.GetType(), "ShowSplashScreen", "ShowSplashScreen(this)");

* 1006 на стороне клиента *

function ShowSplashScreen(source) { 
// Do stuff depending on the button that was clicked
}

В настоящее время «источником» является окно DOM, а не кнопка.

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

Вы можете использовать __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; 
} 
0 голосов
/ 24 ноября 2011

ОК, я нашел обходной путь.Сначала я приведу краткое объяснение, а затем гораздо более длинное для тех, кто в будущем увидит эту страницу, потому что такие любители, как я, которые могут не знать об этом в обратном направлении, могут использовать это, чтобы получить некоторую помощь.(Потому что я живу на гугле этой штуке.)

Функциональность, которую я искал, заключалась в том, чтобы иметь модальный div с различным innerHTML в зависимости от того, какая кнопка была нажата.Я также хотел, чтобы div отображался только в том случае, если страница действительна, и не все кнопки на странице вызывают проверку.

Во время тренировки была создана глобальная переменная «ButtonClicked».Затем КАЖДОЙ кнопке на странице должен быть присвоен javascript для ее атрибута onclick, который устанавливает переменную ButtonClicked в качестве идентификатора кнопки.Сценарий, назначенный для onclick, запускается ДО проверки страницы.Затем, используя ClientScript.RegisterOnSubmitStatement, я назначил функцию, которая будет вызываться после успешной проверки страницы, но непосредственно перед фактической отправкой страницы.Затем я могу получить доступ к событию «ButtonClicked», чтобы увидеть, какая кнопка была только что вызвана, и затем изменить innerHTML модального div, а затем отобразить его.(Затем выполните обратную передачу asyc, затем удалите модальный div после обратной передачи.)

Почему я не могу просто установить innerHTML модального div из функций, которые сами кнопки вызывают?Потому что innerHTML, который я помещаю туда, зависит от того, является ли страница действительной, и я знаю только, является ли страница действительной, когда я получаю функцию ShowSplashScreen.Вы также можете спросить, почему я не просто вызываю страницу для проверки из функции javascript, которую вызывает кнопка.Это происходит потому, что выполнение этого вызывает двойной вызов проверки, и на странице так много информации, что для проверки страницы требуется почти полная секунда, и потому что сама функция проверки на стороне клиента содержит некоторые вещи, которые можно вызывать ТОЛЬКО один разво время проверки.

Таким образом, конечный результат всего этого заключается в том, что function1 и функция 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()");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...