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

标签 c# html asp.net webforms

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

<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>";
        }

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

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

最佳答案

正如其他人所说,问题是当您将控件生成为 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
    }
}

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

测试.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>

测试.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);
            }
        }
    }
}

关于c# - 如何将 runat=server 属性添加到 html 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35034269/

相关文章:

html - 为什么将 ul 向右浮动时 div 没有出现在下一行?

asp.net - 如何限制对 Azure 上运行的网站部分的访问

c# - .NET 正则表达式匹配和替换

c# - 从一段曲面点中找到圆心

c# - 如何在 Outlook 中为自定义按钮添加图像图标

c# - 动态代码片段 c# visual studio

html - IE8-同一过滤器中的渐变和背景图像不起作用?

javascript - 无法使用 .indexOf() 找到数组索引

c# - 验证仅包含数字的正则表达式,不应包含空格和字母

c# - CORS:对预检请求的响应未通过访问控制检查:它没有 HTTP 正常状态