【问题标题】:How to check whether ASP.NET button is clicked or not on page load如何检查页面加载时是否单击了 ASP.NET 按钮
【发布时间】:2017-04-20 14:08:39
【问题描述】:

如何在 ASP.NET 中检查特定按钮是否被点击?

我想我需要对Page_Load 执行一些操作。这不应该进入Button_Click 事件来查找。有什么方法可以让我在客户端找到点击或未点击的位置并将其发送至Page_Load?

【问题讨论】:

  • 你为什么认为你需要加入Page_Load?为什么你不能在按钮点击时处理它?

标签: c# asp.net


【解决方案1】:

背景:基本上是__EVENTTARGET 和__EVENTARGUMENT,这两个隐藏控件被添加到HTML 源代码中,当任何web 控件的任何autopostback 属性设置为true 时。 p>

__EVENTTARGET 隐藏变量将告诉服务器,哪个控件实际上触发了服务器端事件,以便框架可以为该控件触发服务器端事件。

__ EVENTARGUMENT 变量用于在应用程序需要时提供额外的事件信息,这些信息可以在服务器中访问。

所以我们可以很容易地使用:Request.Params.Get("__EVENTTARGET"); 获得导致回发的控件

问题:

方法:Request.Params.Get("__EVENTTARGET"); 将适用于 CheckBoxes、DropDownLists、LinkButtons 等。但这不适用于按钮控件,例如 Buttons 和 ImageButtons

Button 控件和ImageButton 控件不调用__doPostBack 函数。因此,_EVENTTARGET 将始终为空。但是,其他控件使用javascript函数__doPostBack来触发回发。

所以,我会建议做如下的事情。将OnClientClick 属性添加到按钮。此外,在您的标记中定义一个 hiddenField,其值将包含导致回发的实际按钮。

<asp:Button ID="Button1" runat="server" Text="Button"
     OnClientClick = "SetSource(this.id)" />
<asp:ImageButton ID="ImageButton1" runat="server"
     OnClientClick = "SetSource(this.id)" />
<asp:HiddenField ID="hidSourceID" runat="server" />

在Button 和ImageButton 的OnClientClick 属性上调用SetSource JavaScript 函数

<script type = "text/javascript">
    function SetSource(SourceID)
    {
        var hidSourceID =
        document.getElementById("<%=hidSourceID.ClientID%>");
        hidSourceID.value = SourceID;
    }
</script>

从这里开始,您可以非常轻松地在您的Page_Load 中检查哪个 Control 导致了回发:

if (IsPostBack)
{
    string CtrlName;
    CtrlName=hidSourceID.Value;
}

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题,必须在Page_Load方法中做一些逻辑判断来处理不同的事件(点击了哪个按钮)。 我实现手臂得到如下示例。 前端aspx源代码(我有很多ID为F2、F3、F6、F12的Button。

    <Button Style="display: none" ID="F2" runat="server" Text="F2:Cancel" OnClientClick="SeiGyo(this)" OnClick="F2_Click" />
        <Button Style="display: none" ID="F3" runat="server" Text="F3:Return" OnClientClick="SeiGyo(this)" OnClick="F3_Click" />
        <Button Style="display: none" ID="F6" runat="server" Text="F6:Run" OnClientClick="SeiGyo(this)" OnClick="F6_Click" />
        <Button Style="display: none" ID="F12" runat="server" Text="F12:Finish" OnClientClick="SeiGyo(this)" OnClick="F12_Click" />
    

    后端aspx.cs源代码,我需要做的是判断触发Page_Load时点击了哪个按钮。这似乎有点愚蠢,但有效。 在您的情况下,单击的按钮将被添加到 dic 中。我希望这对某人有所帮助。

    Dictionary<string, string> dic = new Dictionary<string, string>();
    foreach(var id in new string[]{"F2","F3","F6","F12"})
    {
           foreach (var key in Request.Params.AllKeys)
                        {
                            if (key != null && key.ToString().Contains(id))
                                dic.Add(id, Request[key.ToString()].ToString()); 
                        }
    }
    

    【讨论】:

    • 如果您使用的是
    【解决方案3】:

    按钮的 UniqueID 将在 Request.Form["__EVENTTARGET"]

    这个问题已经在ASP.NET : Check for click event in page_load得到回答

    【讨论】:

    • 不确定事情是否发生了变化,但是没有,ASP.NET 按钮 UniqueID 没有出现在我的 __EVENTTARGET 中。这似乎验证了 FlopScientist 上面所说的 - 这仅适用于“CheckBoxes、DropDownLists、LinkBut​​tons 等。但这不适用于 Button 控件,例如 Buttons 和 ImageButtons”
    【解决方案4】:

    您可以尝试使用隐藏字段。在 OnclientClick 事件上创建客户端事件并尝试设置隐藏字段的值,根据条件可能为 true 或 false。 在页面加载时,您可以检查隐藏字段的值。

    function click()
    {
    // set the hidden field here
    }
    

    在页面加载时,只需检查值。

    if(HiddenFieldName.Value=="true")
    {
    //perform the action
    }
    

    【讨论】:

      【解决方案5】:
          private bool button1WasClicked = false;
      
          private void button1_Click(object sender, EventArgs e)
          {
              button1WasClicked = true;
          }
      
      
      if ( button1WasClicked== false)
      {
      //do somthing
      }
      

      【讨论】:

      • 在我的代码中,我没有触发 button1_Click 事件。最初 PageLoad 触发,只是想在 PageLoad 中知道按钮是否被点击
      • Page_Load 在任何事件处理程序之前触发。
      猜你喜欢
      • 2012-11-25
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多