【问题标题】:calling server side event from html button control从 html 按钮控件调用服务器端事件
【发布时间】:2026-02-16 04:05:01
【问题描述】:

我正在使用 ASP.Net 创建一个应用程序,其中我在 aspx 页面上有一个 HTML 按钮。

<input type="submit" id="btnSubmit" runat="server" 
   style="background-image:url(App_Themes/default/Images/quiz_class/btn_submit.jpg);
   width:80px; height:29px;" onserverclick="btnSubmit_ServerClick" />

但是当我点击按钮时,它不会调用 aspx.cs 页面上的 btnSubmit_ServerClick 事件。

我不想使用asp控制按钮。

请帮忙..

【问题讨论】:

  • Sooo... 已经 3 年了。你有想过这个吗?采纳答案! (即使你必须先创建它)

标签: asp.net html


【解决方案1】:

对于尝试处理复选框的人来说,这些解决方案都不起作用,因为您需要它是一个 HTML 输入(而不是一个 HTML 按钮)。

SPArcheon 的答案在您添加 type="checkbox" 后不起作用,这是 .checked 运算符在代码隐藏中工作所必需的。只要添加type="checkbox",HTML 输入框就没有OnServerClickServerClickCheckedChanged。你只有ServerChanged,这没用,因为它需要刷新整个页面。

我实际上必须使用 CSS 来使 HTML 按钮类似于一个复选框,使用 Bootstrap 的 btn-outline-secondary 类作为起点。

.btn-checkbox-unchecked {
    padding: .35rem .35rem !important;
    font-size: .875rem !important;
    line-height: .5 !important;
    border-radius: .15rem !important;
    border-width: .20em !important;
}

.btn-checkbox-checked {
    padding: .1rem .1rem !important;
    font-size: .6rem !important;
    line-height: .5 !important;
    border-radius: .15rem !important;
    border-width: .20em !important;
    border-color: #0060df !important;
    background-color: #0060df !important;
}

    .btn-checkbox:hover {
        border-color: #676774 !important;
        background-color: #0250BB !important;
    }

在aspx中:

<button class="btn btn-xs btn-outline-secondary" id="btnFakeCheckbox" runat="server" clientidmode="static" autopostback="true" data-bs-toggle="button" autocomplete="off"></button>

然后在您的代码隐藏中,您可以相应地设置属性(类)

检查时:

btnFakeCheckbox.Attributes.Add("class", "btn btn-xs btn-secondary btn-checkbox-checked active")
btnFakeCheckbox.Attributes("aria-pressed") = "true"
btnFakeCheckbox.InnerHtml = "<i class='fas fa-check'></i>"

未选中时:

btnFakeCheckbox.Attributes.Add("class", "btn btn-xs btn-outline-secondary btn-checkbox-unchecked")
btnFakeCheckbox.Attributes("aria-pressed") = "false"
btnFakeCheckbox.InnerHtml = ""

(请注意最后一行的字体真棒检查图标,您必须将其包含在您的 aspx 中)

对于一个更荒谬的框架来说,这是多么荒谬的解决方法。如果有人有 Bootstrap 5 拨动开关的解决方案,请告诉我。

【讨论】:

    【解决方案2】:

    您可以使用如下事件处理程序 serverclick

    //cmdAction是HTML按钮的id如下

    <body>
        <form id="form1" runat="server">
            <button type="submit" id="cmdAction" text="Button1" runat="server">
                Button1
            </button>
        </form>
    </body>
    

    //cs代码

    public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                    cmdAction.ServerClick += new EventHandler(submit_click);  
            }
    
            protected void submit_click(object sender, EventArgs e)
            {
                Response.Write("HTML Server Button Control");
            }
        }
    

    【讨论】:

      【解决方案3】:

      在您的 aspx 页面上定义 HTML Button 元素,其中包含通常的嫌疑人:runat、class、title 等。

      如果此元素是数据绑定控件的一部分(即:网格视图等),您可能希望使用 CommandName 和可能的 CommandArgument 作为属性。添加按钮的内容和结束标记。

      <button id="cmdAction" 
          runat="server" onserverclick="cmdAction_Click()" 
          class="Button Styles" 
          title="Does something on the server" 
          <!-- for databound controls -->
          CommandName="cmdname"> 
          CommandArgument="args..."
          >
          <!-- content -->
          <span class="ui-icon ..."></span>
          <span class="push">Click Me</span>
      </button>
      

      在页面后面的代码中,元素将调用将定义为元素的 ID_Click 事件函数的处理程序。

      protected void cmdAction_Click(object sender, EventArgs e)
      {
      : do something.
      }
      

      还有其他解决方案,例如使用自定义控件等。还有 请注意,我正在 VS2K8 中的项目中使用此功能。

      希望这会有所帮助。 享受吧!

      【讨论】:

        【解决方案4】:

        只需在按钮点击事件结束时使用它

        protected void btnAddButton_Click(object sender, EventArgs e)
        {
           ... save data routin 
             Response.Redirect(Request.Url.AbsoluteUri);
        }
        

        【讨论】:

          【解决方案5】:

          如果您可以通过指定runat="server" 将输入按钮转换为服务器端控件,并且您正在使用asp.net,则可以选择使用HtmlButton.OnServerClick 属性。

          <input id="foo "runat="server" type="button" onserverclick="foo_OnClick" />
          

          这应该可以在您的服务器端代码中调用foo_OnClick。 另请注意,根据上面链接的 Microsoft 文档,您还应该能够使用 HTML 4.0 标记。

          【讨论】:

          • 如何声明foo_OnClick
          • 知道了:&lt;script language="C#" runat="server"&gt; &lt;/script&gt; 你的 C# 东西必须在这里。
          【解决方案6】:

          完成此操作的最简单方法是覆盖 RaisePostBackEvent 方法。

          <input type="button" ID="btnRaisePostBack" runat="server" onclick="raisePostBack();" ... />
          

          在你的 JavaScript 中:

          raisePostBack = function(){
              __doPostBack("<%=btnRaisePostBack.ClientID%>", "");
          }
          

          在你的代码中:

          protected override void RaisePostBackEvent(IPostBackEventHandler source, string eventArgument)
          {
              //call the RaisePostBack event 
              base.RaisePostBackEvent(source, eventArgument);
          
              if (source == btnRaisePostBack)
              {
                   //do some logic
              }
          }
          

          【讨论】:

          • 我试过这段代码,一个回发被触发但protected override void RaisePostBackEvent函数没有被执行。如何解决这个问题?
          【解决方案7】:

          请按照本教程进行操作:http://decoding.wordpress.com/2008/11/14/aspnet-how-to-call-a-server-side-method-from-client-side-javascript/

          附带说明:ASP.NET 生成一个客户端 javascript 函数,您可以从自己的函数中调用该函数来执行所需的回发。

          -- 更多关于劫持回发事件的信息:

          【讨论】: