Как страница asp.net узнает, какая кнопка вызвала обратную передачу? - PullRequest
5 голосов
/ 29 июня 2010

Я пишу некоторый код, который имитирует эффект обратной отправки на страницу, выполняя точно такой же веб-запрос, который будет сгенерирован при нажатии кнопки, которая запускает обратную передачу страницы.

Проблема в том, чточто ответ от веб-запроса не совпадает с ответом, который я получаю при нажатии на кнопку.

При расследовании я вижу, что даже если событие Page_Load инициируется и обрабатывается при выполнении веб-запроса,обработчик для нажатия кнопки не выполняется (это означает, что либо событие не инициируется, либо оно инициируется, но не обрабатывается - я предполагаю, что это более вероятно в первом случае).

Итак, мой вопрос - как ASP.NET узнает, какая кнопка была нажата, чтобы вызвать соответствующий обработчик?

Я думал, что это было сделано с помощью параметра __EVENTTARGET - я правильно установил это втело сообщения веб-запроса, но это не имеет значения.

Я посмотрел на декодированный __Аргумент VIEWSTATE, но я не мог видеть ничего очевидного там.

Может ли кто-нибудь оказать дальнейшую помощь?

РЕДАКТИРОВАТЬ: Просто чтобы прояснить, я не спрашивает, как добавить обработчик кликов в веб-приложение.

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

Ответы [ 7 ]

6 голосов
/ 06 июня 2011

Во-первых, кнопка ASP.NET <asp:button> отображается как элемент <input type="submit" runat="server"...> в форме. Применительно к обратным передачам эта кнопка ведет себя по-другому по сравнению с другими элементами управления.

При нажатии <input type="submit"...> автоматически запускает обратную передачу без помощи ASP.NET (попробуйте в формате .htm). Вы можете определить, какая кнопка была нажата, просмотрев параметры тела POST. Имя кнопки и ее значение (текстовое содержание) будут отправлены в качестве параметров. __EVENTTARGET отсутствует на картинке и должно быть нулевым. Кроме того, в списке параметров будет указана ТОЛЬКО ОДНА кнопка управления в соответствии со спецификацией (той, которая была нажата). Итак, теперь вы знаете, какая кнопка была нажата.

Тогда какая польза от __EVENTTARGET?

Другие элементы управления, такие как <asp:DropDownList>, которые отображаются как SELECT, не запускают обратную передачу при нажатии, а просто вызывают событие javascript onChange. Если вы хотите обработать событие на стороне сервера с помощью события SelectedIndexChanged, ASP.NET придется выполнить дополнительную работу за вас. Если вы установите AutoPostBack = True для DropDownList, ASP.NET перехватит исходное событие onChange JS и подключит пользовательскую функцию __doPostBack JS, которая отвечает за заполнение __EVENTTARGET и , явно отправляющих форму. Теперь вы можете определить элемент управления, который вызвал обратную передачу, изучив __EVENTTARGET.

Надеюсь, это немного поможет!

1 голос
/ 29 июня 2010

Я не могу ответить на ваш вопрос, но могу рассказать вам, как это выяснить.

Добавьте строку к вашей page_load: Request.SaveAs (@ "c: \ temp \ request.txt",правда);(для примера).

Затем нажмите кнопку, чтобы выполнить обратную передачу.

Затем прочитайте содержимое файла request.txt.Там есть что-нибудь полезное или интересное?

0 голосов
/ 30 июня 2010

Shoko,

Обратные передачи ASP.net могут быть сложными, но вы должны взглянуть на эту статью, используя для этого некоторую информацию о функции javascript __doPostBack ().

http://www.dotnetspider.com/resources/1521-How-call-Postback-from-Javascript.aspx

HTH,

Майк

0 голосов
/ 30 июня 2010

ОК, так что я понял это в конце.

Запрос должен содержать пару «имя-значение», где имя - это идентификатор нажатой кнопки, а значение может быть равно «1».

Что меня озадачило, так это то, что в запросе, генерируемом нажатием кнопки, я не увидел такой пары имя-значение. Очень странно.

Тем не менее, добавление этой пары имя-значение в мой созданный веб-запрос вызвало запуск кода обработчика события нажатия кнопки.

0 голосов
/ 29 июня 2010

Похоже, что только значение __ EVENTTARGET должно быть опубликовано с идентификатором кнопки, которую вы хотите нажать. Вы должны установить EnableEventValidation = "false" , иначе ASP.NET выдаст ошибку. Проверьте этот пример. Обычная HTML-страница, публикации на странице asp.net, имитирующие нажатие кнопки на этой странице, что должно быть похоже на то, что вы пытаетесь сделать.

HTML-страница:

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
    <form action="Default.aspx" method="post">
    <input value="cmdSubmit" name="__EVENTTARGET" type="hidden" />
    <input type="submit" value="submit" />
    </form>
</body>
</html>

Страница ASP.NET с кнопкой для нажатия (Default.aspx):

<%@ Page Language="C#"  EnableEventValidation="false"    %>
<script runat="server">

    protected void cmdSubmit_Click(object sender, EventArgs e)
    {
        litResult.Text = "Submit button clicked";
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
    <form id="form1" runat="server">
    <asp:Literal ID="litResult" runat="server" EnableViewState="false"></asp:Literal>
    <asp:Button UseSubmitBehavior="false" ID="cmdSubmit" EnableViewState="false" runat="server"
        OnClick="cmdSubmit_Click" Text="Submit" />
    </form>
</body>
</html>
0 голосов
/ 29 июня 2010

Существует несколько простых способов создать обработчик событий для кнопки. В режиме макета дважды нажмите на кнопку. Или также в режиме макета выберите кнопку, откройте окно «Свойства», щелкните значок «молния» и просмотрите список событий, которые может вызвать элемент управления. Дважды щелкните по нужному событию.

Когда вы выполните одно из этих действий, Visual Studio создаст обработчик события в вашем коде и подключит событие.

Обработчик события кнопки запускается после загрузки страницы и после проверки страницы, если вы используете валидаторы ASP.NET.

0 голосов
/ 29 июня 2010

В вашем коде должно быть событие для обработки, и это событие должно иметь Handles ButtonName.Click

IE:

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    ''# Process everything you want to process when Button2 gets clicked
End Sub

Кроме того, в вашей кнопке вы можете установить OnClick в разметке.

<asp:button ID="Button2" runat="server" OnClick="Button2_Click" Text="Click Me" />

Поскольку кнопка установлена ​​на runat="server", .NET сделает всю тяжелую работу за вас.

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