如何确定哪个按钮引起了页面回传(postback)?

9

我有两个按钮控件。当我点击其中一个时,我想确定是哪一个导致了页面加载的回发。如何确定这一点?


6
你为什么不处理按钮的点击事件?这样你就会有两个不同的处理程序,一个用于每个按钮。除此之外:确定引起回发的控件。 - Tim Schmelter
1
你如何处理postback?通过哪个事件? - abatishchev
@huMptyduMpty - 说得好,但你可能会认为蒂姆的评论和我的回答本身就值得保存? - CJM
5个回答

3
使用CommandName和CommandArgument,如此示例中所示。这样您只需要一个处理程序。
<asp:Button id="Button1"
       Text="Sort Ascending"
       CommandName="Sort"
       CommandArgument="Ascending"
       OnCommand="CommandBtn_Click" 
       runat="server"/>

  <asp:Button id="Button2"
       Text="Sort Descending"
       CommandName="Sort"
       CommandArgument="Descending"
       OnCommand="CommandBtn_Click" 
       runat="server"/>

1
var button = sender as Button; (变量)button = sender as Button; - Govind Malviya
@Govind:没错。sender is Button2sender as Button2((Button)sender)).ID以及其他许多方式。但总的来说是个好建议。 - abatishchev

2

您是否有经典ASP背景?当我第一次使用ASP.NET时,我也有同样的问题。

考虑另一种方法:

与其在Form_Load中检测postback,然后找出是什么触发了它,不如为每个按钮创建一个特定的事件处理程序。这就是Web Forms的全部意义-让您可以以非常类似于Windows应用程序的方式开发应用程序。


1
我想从表单加载中了解而不是创建特定事件的原因是,我正在创建一个动态表格,正如您所知,每次进行回发时都必须重新创建它。嗯,我注意到这会导致我的页面变慢,并且在这种情况下,当我不需要使用该特定功能来重新创建该表格时,我不知道哪个按钮/控件引起了回发。 - Will
在这种情况下,您可以使用上面介绍的 Request["__EVENTTARGET"] 方法(并将其标记为答案)。 - Darbio

1

当使用type为button的输入框时,其值将通过post请求发送。例如,如果您有<input type="button" name="Quote" value="Quote">,则会在Post中得到button-name=Quote,就像简单文本输入一样。因此,您可以使用以下代码检查post是否包含按钮的值(对不起,我的vb):

Dim isQuote As Boolean = HttpContext.Current.Request.Form(SubmitQuote.UniqueID) IsNot Nothing

因此,如果它不是Nothing(null),那么提交了SubmitQuote按钮的post请求。

顺便说一句,对我来说HttpContext.Current.Request("__EVENTTARGET")也无法正常工作。


1

在我的实现中,页面上有几个表单;如果某些按钮控件触发了后台提交,就需要执行进一步的操作。

这些控件的类型如下,它们不会填充Request["__EVENTTARGET"]

  • 按钮(在表单的根部)
  • 图像按钮(嵌套在Datagrid内部)

我通过检查在Page_Load子程序中传递给表单请求的控件的UniqueID来确定以下按钮控件是否引发了后台提交:

- ASP.NET:
    <asp:Button ID="Button1" runat="server" />
    <asp:Button ID="Button2" runat="server" />

为了轻松处理以下嵌套图像按钮引发的后续请求,我利用OnClientClick属性调用一个Javascript函数,该函数将补充隐藏字段控件的值填充为触发控件的UniqueID,然后同样在Page_Load子程序中检查隐藏控件的值:

- ASP.NET:
    <script type="text/javascript">
        function SetSource(SourceID) {
            var hiddenField = document.getElementById("<%=HiddenField1.ClientID%>");
            hiddenField.value = SourceID;
        }
    </script>

    <asp:HiddenField ID="HiddenField1" runat="server" Value="" />
    <asp:ImageButton ID="ImageButton1" runat="server" OnClientClick="SetSource(this.id)" />

Page_Load将通过某种方式实现:

-VB.NET
     Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
        ' ...
        If Not Page.IsPostBack Then
            If Not String.IsNullOrEmpty(Me.Page.Request.Form(Button1.UniqueID)) Then
                ' ...
            ElseIf Not String.IsNullOrEmpty(Me.Page.Request.Form(Button2.UniqueID)) Then
                ' ...
            ElseIf Not Me.Page.Request.Form(HiddenField1.UniqueID) Is Nothing _
                And Not String.IsNullOrEmpty(Me.Page.Request.Form(HiddenField1.UniqueID)) Then
                ' ...
                HiddenField1.Value = String.Empty
            Else
                ' ...
            End If
        End If
    End Sub

1
这是JavaScript的方法,但另一种替代方案是这个答案 - David Rogers

0
在页面加载时检查这个。
String ButtonID = Request["__EVENTTARGET"];

很好,我不知道这个技巧。 - Kamran Pervaiz
1
这将为您提供发送请求的对象的“UniqueID”。例如,button.UniqueID - Darbio
不适用于具有提交按钮的按钮。 - Ishikawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接