【问题标题】:How to determine which button caused postback如何确定哪个按钮导致回发
【发布时间】:2012-05-01 01:56:22
【问题描述】:

我有 2 个按钮控件。当我单击一个时,我试图确定哪一个导致页面加载中的回发。这个怎么确定?

【问题讨论】:

  • 你为什么不处理按钮的click-event?然后你会有两个不同的处理程序,每个按钮一个。除此之外:Determining the Control that Caused a PostBack
  • 你如何处理回发?通过什么活动?
  • @huMptyduMpty - 公平点,但您可能会争辩说蒂姆的评论和我的回答本身就值得保留?

标签: asp.net .net vb.net postback


【解决方案1】:

在我的实现中,我的页面上有几种形式;如果某个按钮控件触发了回发,则需要进一步操作。

控件属于以下类型,不填充Request["__EVENTTARGET"]

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

我通过查看控件的UniqueID 是否已在Page_Load 子中传递给表单请求来确定以下按钮控件是否引发了回发:

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

为了简单地处理以下嵌套图像按钮是否引发了回发,我利用了OnClientClick 属性,该属性调用了一个 javascript 函数,该函数将使用煽动控制,然后在Page_Lode sub中类似地查看隐藏的控制值:

- 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

【讨论】:

  • 这是 JavaScript 方法,但另一种方法是 this answer
【解决方案2】:

真正的输入类型按钮在发布请求中发送其值。例如,如果您有,您将进入 Post button-name=Quote ,就像它是简单的文本输入一样。因此,您可以使用以下代码检查帖子是否包含按钮的值(对不起我的 vb):

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

所以如果它不是 Nothing (null) 则帖子已通过 SubmitQuote 按钮发送。

顺便说一句,对我来说 HttpContext.Current.Request("__EVENTTARGET") 也不起作用。

【讨论】:

    【解决方案3】:

    this example 中显示了如何使用 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"/>
    

    【讨论】:

    • like: var button = sender as Button;
    • @Govind:对。 sender is Button2sender as Button2((Button)sender)).ID 和许多其他方式。但总的来说还是不错的建议。
    【解决方案4】:

    在页面加载时检查这个

    String ButtonID = Request["__EVENTTARGET"];
    

    【讨论】:

    • 很好。我不知道这种技术。
    • 这将为您提供发送请求的对象的UniqueID。例如button.UniqueID
    【解决方案5】:

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

    考虑另一种方法:

    与其在 Form_Load 中检测回发,然后找出触发它的原因,不如为每个按钮创建一个特定的事件处理程序。这就是 Web 窗体的全部意义所在 - 因此您可以使用与开发 Windows 应用程序非常相似的方式来开发应用程序。

    【讨论】:

    • 我想从表单加载而不是创建特定事件中知道的原因是我创建了一个动态表,而且你知道我每次执行时都必须重新创建它回发。好吧,我注意到它导致我的页面变慢,并且我在这个例子中看到当我不需要使用该特定功能来重新创建该表但我不知道是什么按钮/控件导致该回发
    • 这种情况下,可以使用上面解释的Request["__EVENTTARGET"]方法(并标记为答案)
    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多