如何将 runat=server 属性添加到 html 按钮

Posted

技术标签:

【中文标题】如何将 runat=server 属性添加到 html 按钮【英文标题】:How to add runat=server attribute to html buttons 【发布时间】:2016-05-04 05:19:40 【问题描述】:

我有多个使用 csharp 类上的方法从服务器端生成的 html 按钮。 结果是:

<button ID='btn1' runat='server' onserverclick='btn_Click'>Apply</button>
<button ID='btn2' runat='server' onserverclick='btn_Click'>Apply</button>
<button ID='btn3' runat='server' onserverclick='btn_Click'>Apply</button>
...
<button ID='btnN' runat='server' onserverclick='btn_Click'>Apply</button>

我还在后面的代码中添加了 btn_Click 事件:

protected void btn_Click (object sender, EventArgs e)

    string id = (sender as Control).ClientID;
    msg = id;

如您所见,我想获取 buttonId,但是当我单击任何按钮时,btn_Click 不会调用并且我无法获取 buttonId。 我正在使用 c#4.0 的 asp.net 网站。

问题是我需要使用服务器端生成按钮,而 runat 属性不适用于我的方法。我该如何解决这个问题? 这是我生成按钮的方法体

for (int i = 0; i < dt.Rows.Count; i++)
        
            DateTime dtTemp = DateTime.Parse(dt.Rows[i]["messageDate"].ToString());
            if (dt.Rows[i]["isRead"].ToString() == "True")
                readed = "MessageReaded";
            else
                readed = "MessageNew";
            post += "<div class='modal fade' id='myModal" + dt.Rows[i]["messageId"].ToString() + "' tabindex='-1' role='dialog' aria-labelledby='myModalLabel'>"
                + "<div class='modal-dialog' role='document'>"
                + "<div class='modal-content'>"
                + "<div class='modal-header'><button type='button' class='close' data-dismiss='modal' aria-label='Close'><span aria-hidden='true'>&times;</span></button><h4 class='modal-title' id='myModalLabel'><span style='font-weight:bold'>subject</span> : " + dt.Rows[i]["subject"].ToString() + "</h4></div>"
                + "<div class='modal-header'><p><span style='font-weight:bold'>date</span> : " + dtTemp.ToString("yyyy/MM/dd") + "</p>"
                + "<p><span style='font-weight:bold'>Time</span> : " + dt.Rows[i]["messageTime"].ToString() + "</p>"
                + "<p><span style='font-weight:bold'>email</span> : " + dt.Rows[i]["email"].ToString() + "</p></div>"
                + "<div class='modal-body'>" + dt.Rows[i]["message"].ToString() + "</div>"
                + "<div class='modal-footer'><button type='button' class='btn btn-default' data-dismiss='modal'>close</button>"
                + "<button ID='btn" + dt.Rows[i]["messageId"].ToString() + "'  class='btn btn-danger' onclick='DeleteMessage_Click'>Delete</button></div>"
                + "</div></div></div>";
            string narrow = Special.TimeToNarrow(dt.Rows[i]["messageDate"].ToString(), dt.Rows[i]["messageTime"].ToString());
            post += "<a data-toggle='modal' data-target='#myModal" + dt.Rows[i]["messageId"].ToString() + "' href='#' class='list-group-item " + readed + "'><span class='badge'>" + narrow + "</span><i class='fa fa-fw fa-comment'></i> <span>"
                     + dt.Rows[i]["name"].ToString() + "</span> : <span>" + dt.Rows[i]["subject"].ToString() + "</span></a>";
        

所以问题出在 &lt;button ID='btn" + dt.Rows[i]["messageId"].ToString() + "' runat='server' class='btn btn-danger' onserverclick='DeleteMessage_Click'&gt;Delete&lt;/button&gt;

编辑我的帖子:如您所见,我不能使用 asp:button 因为使用引导模式。如果您认为我仍然可以使用 asp:button 请编写您的代码并告诉我如何使用。谢谢

【问题讨论】:

我有多个从服务器端生成的 html 按钮。您的意思是,您一直在将带有 runat="server" 属性的 html 按钮动态添加到 Literal 中。如果这就是您想要执行的操作,那么 SORRY 我的朋友,这在这个时代是不可能的。 【参考方案1】:

正如其他人所说,当您将控件生成为 HTML 字符串时,问题是 ASP.NET 无法识别 runat="server"

您的代码可能应该以完全不同的方式完成,但如果您想改变已经完成的工作,那么您可以采用不同的方式。

而不是按钮上的runat="server",让它们提交按钮并为其分配名称和值,例如...

而不是这个:

<button ID='btn1' runat='server' onserverclick='btn_Click'>Apply</button>
<button ID='btn2' runat='server' onserverclick='btn_Click'>Apply</button>
<button ID='btn3' runat='server' onserverclick='btn_Click'>Apply</button>

执行此操作(注意它们都具有相同的名称):

<button name="btn" type="submit" value="1">Apply</button>
<button name="btn" type="submit" value="2">Apply</button>
<button name="btn" type="submit" value="3">Apply</button>

然后在您的 Page_Load 事件中,您可以检测是否点击了以下按钮之一:

if (Page.IsPostBack)

    if (Request.Form["btn"] != null)
    
         //A btn was clicked, get it's value
         int btn = int.Parse(Request.Form["btn"]);

         //Do something with this btn number
    

这是一个包含三个按钮并显示被点击的按钮编号的小示例:

Test.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Test" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <button name="btn" type="submit" value="1">Apply</button>
        <button name="btn" type="submit" value="2">Apply</button>
        <button name="btn" type="submit" value="3">Apply</button>
    </form>
</body>
</html>

test.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Test : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e)
    
        if (Page.IsPostBack)
        
            if (Request.Form["btn"] != null)
            
                int btn = int.Parse(Request.Form["btn"]);

                Response.Write(btn);
            
        
    

【讨论】:

没有什么是不可能的...绝妙的解决方案! .非常感谢您节省了我的时间:***【参考方案2】:

前面的cmets是正确的,asp.net服务器控件中没有onserverclick。 onserverclick 仅可用于 html 控件。 下面的代码片段完成了这项工作;

protected void btn1_ServerClick(object sender, EventArgs e)

    HtmlButton btn = (HtmlButton)sender;

    btn.InnerText = btn.ID;

将发送者强制转换为 HtmlButton 以访问 ID。您必须使用命名空间“System.Web.UI.HtmlControls”。

编辑:

如果按钮是动态生成的,那么最好使用服务器按钮控件;

 <asp:Button ID="btnAddUser" runat="server" Text="Add"  OnClick="btnAddUser_Click" />

【讨论】:

该代码不适用于动态生成的按钮。最好使用服务器控件。【参考方案3】:

asp 中没有onserverclick。 您应该添加asp:Button 标签而不是仅仅Button 而不是onserverclick 只是OnClick

类似:

<asp:Button ID='btn1' runat='server' Text="Apply" OnClick='btn_Click'/>

编辑 按钮生成方法应该是这样的:

for (int i = 0; i < dt.Rows.Count; i++)
<div class='modal fade' id='myModal" + dt.Rows[i]["Id"].ToString() + "' tabindex='-1' role='dialog' aria-labelledby='myModalLabel'>
     <div class='modal-dialog' role='document'>
          <div class='modal-content'>
              <div class='modal-header'><button type='button' class='close' data-dismiss='modal' aria-label='Close'><span aria-hidden='true'>&times;</span></button><h4 class='modal-title' id='myModalLabel'><span style='font-weight:bold'>subject</span> :subject</h4></div>
              <div class='modal-header'><p><span style='font-weight:bold'>Date</span> : yyyy/MM/dd</p>
                    <p><span style='font-weight:bold'>Time</span>messageTime</p>
                    <p><span style='font-weight:bold'>Email</span>email</p>
              </div>
              <div class='modal-body'>message</div>
              <div class='modal-footer'>
                   <button type='button' class='btn btn-default' data-dismiss='modal'>close</button>
                   <asp:Button ID='btn" + dt.Rows[i]["messageId"].ToString() + "' runat='server'  class='btn btn-danger' OnClick='DeleteMessage_Click'>Delete</button> 
              </div>
          </div>
     </div>

您可以在这一行看到:&lt;button ID='btn" + dt.Rows[i]["messageId"].ToString() + "' runat='server' class='btn btn-danger' onserverclick='DeleteMessage_Click'&gt;Delete&lt;/button&gt; 我已将button 更改为asp:Button,将onserverclick 更改为OnClick

【讨论】:

@BlueMoon: 是的,但你没有在代码中使用OnClick,而是onserverclick。为这个答案 +1 你认为我的方法必须使用 to click 而不是 onserverclick 吗? 我需要使用 html 按钮,请问您有什么建议? @BlueMoon 你不能使用没有&lt;asp:...&gt; 标签的runat 属性。 不不。 for body 是一个字符串,我无法通过 string 生成 asp 控件。我只想显示文本的结果

以上是关于如何将 runat=server 属性添加到 html 按钮的主要内容,如果未能解决你的问题,请参考以下文章

转载写runat="server"有什么用

为啥 ASP.Net 服务器控件声明需要 runat="server" 属性?

如何将标识属性添加到 SQL Server 中的现有列

如何在运行时向转发器项目添加属性?

添加 runat="server" 时 Datepicker 不工作

当单选按钮为runat =“服务器”时使用jQuery检查单选按钮?