asp.net页面如何知道哪个按钮触发了回发?

时间:2010-06-29 00:06:30

标签: asp.net httpwebrequest

我正在编写一些代码,这些代码模仿了通过执行与单击触发页面回发的按钮时生成的完全相同的Web请求来对页面进行回发的效果。

问题是网页请求的响应与点击按钮时的响应不一样。

在调查时,我看到即使在执行Web请求时触发并处理了Page_Load事件,也没有执行按钮单击的处理程序(意味着事件未被触发,或者它被触发但是没处理 - 我猜它更有可能是前一种情况。)

所以我的问题是 - ASP.NET如何知道点击了哪个按钮以便它可以调用相应的处理程序?

我认为这是通过使用__EVENTTARGET参数完成的 - 我已经在Web请求的帖子正文中正确设置了它,但这没有任何区别。

我查看了已解码的__VIEWSTATE参数,但我看不到任何明显的内容。

任何人都可以提供任何进一步的帮助吗?

编辑:为了清楚起见,我询问如何向网络应用程序添加点击处理程序。

相反,我正在看一个已经有一个按钮点击事件处理程序的应用程序,我想知道asp.net如何从传入的Web请求中找出哪个按钮单击事件处理程序代码调用

7 个答案:

答案 0 :(得分:6)

首先,ASP.NET按钮<asp:button>在表单上呈现为<input type="submit" runat="server"...>元素。参考回发,与其他控件相比,此按钮的行为有所不同。

点击<input type="submit"...>会在没有ASP.NET 的情况下自动触发回发(在.htm中尝试)。您可以通过查看POST正文的参数来确定单击了哪个按钮。按钮名称及其值(Text prop。)将作为参数发送。 __EVENTTARGET不在图片中,应为null。此外,根据规范(单击的那个),参数列表中只有一个按钮控件。所以现在你知道点击了哪个按钮。

那么__EVENTTARGET的用途是什么?

其他控件(如呈现为<asp:DropDownList>的{​​{1}})在单击时不会触发回发,而只是引发onChange javascript事件。如果您想通过SELECT事件在服务器端处理事件,ASP.NET将不得不为您做一些额外的工作。如果为DropDownList设置AutoPostBack = True,ASP.NET将捕获原始onChange JS事件并连接一个自定义__doPostBack JS函数,该函数负责填充__EVENTTARGET并显式提交表单。您现在可以通过检查__EVENTTARGET来确定触发回发的控件。

希望这有点帮助!

答案 1 :(得分:1)

我无法回答你的问题,但我可以告诉你如何找出答案。

在page_load中添加一行:Request.SaveAs(@“c:\ temp \ request.txt”,true); (例如)。

然后单击您的按钮以实现回发。

然后阅读request.txt的内容。那里有什么有用或有趣的东西吗?

答案 2 :(得分:0)

在您的代码中,您必须要处理一个事件,并且该事件必须有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将为您完成所有繁重的任务。

答案 3 :(得分:0)

有许多简单的方法可以为按钮创建事件处理程序。在布局模式下,双击按钮。或者,在布局模式下,选择按钮,打开“属性”窗口,单击“闪电”图标,然后查看控件可以触发的事件列表。双击您想要的活动。

当您执行其中一项操作时,Visual Studio将在代码隐藏中创建事件处理程序,并将事件连接起来。

按钮事件处理程序在页面加载后运行,在页面验证后运行,如果您使用的是ASP.NET验证程序。

答案 4 :(得分:0)

看起来只需要使用您要点击的按钮的ID发布 __ 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>

答案 5 :(得分:0)

好的,所以我最终想到了这一点。

请求应包含名称值对,其中name是单击按钮的id,值可以是“1”。

让我困惑的是,在点击按钮生成的请求中,我没有看到这样的名称值对。确实很奇怪。

然而,将此名称值对添加到我创建的Web请求中会导致触发按钮单击事件处理程序代码。

答案 6 :(得分:0)

祥子,

ASP.net回发可能很棘手,但您应该使用__doPostBack()javascript函数来查看本文,以获得一些见解。

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

HTH,

麦克