Способ узнать, какая кнопка отправляет страницу?

У меня есть функция, связанная с 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()");
}
Другие вопросы по тегам