Нажатие кнопки / отправка страницы из JavaScript - PullRequest
3 голосов
/ 01 мая 2011

Я хотел бы понять, как инфраструктура asp.net знает, когда была нажата кнопка, и, как только она получает запрос, запускает событие щелчка на сервере.

Мне нужно понять, как это работает, как я хотел бы вызвать событие нажатия кнопки сервера из JavaScript.

Я могу выполнить отправку страницы из JavaScript:

 document.forms[0].submit();

Но как можно сделать то же самое, чтобы asp.net подумал, что нажатие кнопки произошло, поэтому на сервере его событие нажатия срабатывает после получения запроса.

Спасибо

ОБНОВЛЕНИЕ 1

Спасибо всем за ответы. Выполняя несколько тестов, если я добавлю одну кнопку asp.net и, посмотрев на исходный код, я не могу найти сгенерированную функцию JavaScript «__doPostBack».

Это тест, который я пробовал.

У меня есть одна обычная кнопка HTML (button1) и кнопка asp.net. (Button2)

Из события нажатия кнопки HTML (button1) я добавил клиентский вызов методу javascript __doPostback, передавая идентификатор asp.net button2.

Поэтому я пытаюсь вызвать событие нажатия кнопки button2 на стороне сервера, вызвав кнопку html (button1.)

<html xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    <title></title>  
</head>  
<body>  
    <form id="form1" runat="server">  
    <div>  
        <input id="Button1" type="button" 
         value="Raise Button2 server side click event"
         onclick="javascript:__doPostBack('Button2', '')" /> 

        <asp:Button ID="Button2" runat="server" 
        Text="asp.net_Button2" 
        OnClick="button2Click" />  
    </div>  
    </form>  
</body>  
</html> 

и сгенерированный HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
</title>
</head>
<body>
    <form name="form1" method="post" action="Default6.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
value="/wEPDwUKMjA0OTM4MTAwNGRke29WUkB+FLhQArxd1ehT98cWw1Y=" />
</div>

<div>

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" 
value="/wEWAgKLs+3sDgK7q7GGCBs2MBvLk9CJNnA02t08R1LKdiJU" />
</div>
    <div>
        <input id="Button1" type="button" value="Raise Button2 server side click event" 
onclick="javascript:__doPostBack('Button2', '')" />
        <input type="submit" name="Button2" value="asp.net_Button2" id="Button2" />
    </div>
    </form>
</body>
</html>  

ОБНОВЛЕНИЕ 2

Если установить для атрибута кнопок «UseSubmitBehavior» значение false, он сгенерирует метод __doPostBack и, вызывая его из клиента, вызовет событие на сервере.

Так в чем же разница между отправкой и обратной передачей? (Я начну новую тему для этого).
Спасибо за помощь!

Ответы [ 5 ]

2 голосов
/ 01 мая 2011

Функция javascript __doPostBack вызывается всякий раз, когда необходимо отправить страницу обратно.

Чтобы узнать о __doPostBack, прочитайте эту статью.


EDIT

Используйте свойство UseSubmitBehavior, чтобы указать, использует ли элемент управления Button механизм отправки клиентского браузера или механизм обратной передачи ASP.NET . По умолчанию значение этого свойства равно true , в результате чего элемент управления Button использует механизм отправки браузера . Если вы укажете false , каркас страницы ASP.NET добавляет клиентский сценарий на страницу для отправки формы на сервер.

Когда свойство UseSubmitBehavior имеет значение false , разработчики элементов управления могут использовать метод GetPostBackEventReference для возврата события обратной передачи клиента для Button. Строка, возвращаемая методом GetPostBackEventReference, содержит текст вызова функции на стороне клиента и может быть вставлена ​​в обработчик событий на стороне клиента.


См .:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.usesubmitbehavior.aspx

http://www.w3schools.com/ASPNET/prop_webcontrol_button_usesubmitbehavior.asp

2 голосов
/ 01 мая 2011

Вы можете отлично имитировать нажатие кнопки с помощью кода на стороне клиента:

document.getElementById("<%=Button1.ClientID%>").click();

Button1 - это идентификатор кнопки «на стороне сервера».

1 голос
/ 01 мая 2011

Вот код, отвечающий за выполнение правильного метода на стороне сервера:

private void RaisePostBackEvent(NameValueCollection postData)
{
    if (this._registeredControlThatRequireRaiseEvent != null)
    {
        this.RaisePostBackEvent(this._registeredControlThatRequireRaiseEvent, null);
    }
    else
    {
        string str = postData["__EVENTTARGET"];
        bool flag = !string.IsNullOrEmpty(str);
        if (flag || (this.AutoPostBackControl != null))
        {
            Control control = null;
            if (flag)
            {
                control = this.FindControl(str);
            }
            if ((control != null) && (control.PostBackEventHandler != null))
            {
                string eventArgument = postData["__EVENTARGUMENT"];
                this.RaisePostBackEvent(control.PostBackEventHandler, eventArgument);
            }
        }
        else
        {
            this.Validate();
        }
    }
}

Это взято из исходного кода класса Page, .NET 4.0

Как вы видите и как уже объяснил SLaks, код ищет элемент управления с идентификатором, равным идентификатору, переданному в виде скрытого поля формы, называемого __EVENTTARGET, и затем вызывает обработчик PostBackEventHandler, если существует.

1 голос
/ 01 мая 2011
1 голос
/ 01 мая 2011

ASP.Net добавляет обработчик onclick на стороне клиента к кнопке, которая вызывает метод __doPostback на стороне клиента с именем кнопки в качестве параметра.
Этот метод вставляет имя кнопки в скрытое поле иотправляет форму.
(Вы можете увидеть все это в источнике страницы)

На сервере ASP.Net ищет имена элементов управления и событий из скрытого поля и вызывает соответствующую серверную часть.имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...