为啥 C# 的 onClick 事件在表标签的 <td> 中不起作用

Posted

技术标签:

【中文标题】为啥 C# 的 onClick 事件在表标签的 <td> 中不起作用【英文标题】:why onClick Event of C# not working in <td> of table tag为什么 C# 的 onClick 事件在表标签的 <td> 中不起作用 【发布时间】:2017-10-28 01:11:45 【问题描述】:

我正在尝试通过连接字符串在标记中动态生成 onClick 事件并获得我想要的结果,但是当我单击元素时,事件不起作用。我认为这可能不支持 onClick 事件并尝试了其他方法,例如将 onClick 放入等,但没有任何效果。请在这里帮助我。

我的html代码:

<table class="downloadTable">
        <tr>
            <th class="sn">SN</th>
            <th class="assi">Notes Title</th>
            <th class="pby">Subject</th>
            <th class="ld">Posted by</th>
            <th class="dp">Posted date</th>
        </tr><%=getNotesData()%> 
    </table>

我的 C# 编码:

 public string getAssignmentData()

    string data = "";
    string CS = ConfigurationManager.ConnectionStrings["_logdb"].ConnectionString;
    using (SqlConnection conn = new SqlConnection(CS))
    
        string query = "Select * from _tbNotes";
        SqlCommand comm = new SqlCommand(query, conn);
        conn.Open();
        using (SqlDataReader drd = comm.ExecuteReader())
        
            if (drd.HasRows)
            
                while (drd.Read())
                
                    int id = 1;
                    string title = drd.GetString(1);
                    string sub = drd.GetString(2);
                    string auth = drd.GetString(3);
                    data += "<tr OnClick=\"_storeDetails(4)\"><td>" + id + "</td><td>" + title + "</td><td>" + sub + "</td><td>" + auth + "</td></tr>";
                    id++;
                
            
        
        return data;

    

我调用 onClick() 的函数

protected void _storeDetails(int uid)

    Session["AssignmentNo"] = uid;
    Response.Redirect("~/ViewAssignment.aspx");

生成的浏览器代码:

<table class="massi tb">
<tbody>
    <tr>
        <th class="sn">SN</th>
        <th class="assi">Assignment Title</th>
        <th class="pby">Posted By</th>
        <th class="pd">Post Date</th>
        <th class="ld">Last Submit Date</th>
    </tr>


    <tr onclick="_storeDetails(4)">
        <td>1</td>
        <td>Java assignment 1</td>
        <td>java</td>
        <td>tanvi</td>
    </tr>
    <tr onclick="_storeDetails(4)">
        <td>1</td>
        <td>vector graphics</td>
        <td>web development</td>
        <td>pandey</td>
    </tr>
    <tr onclick="_storeDetails(4)">
        <td>1</td>
        <td>Advance java assignment 2</td>
        <td>Advance Java</td>
        <td>Tenvi Gautam</td>
    </tr>
    <tr>
        <td>1</td>
        <td onclick="_storeDetails">Java assignment 1</td>
        <td>java</td>
        <td>tanvi</td>
    </tr>
</tbody>

请帮助我我在这里做错了什么。另外,如果您做同样的工作有任何替代方法,请告诉我。

【问题讨论】:

【参考方案1】:

这行不通,因为:

<tr onclick="_storeDetails(4)">

表示在客户端调用函数_storeDetails。因此,该函数必须是 javascript 函数。

您的storeDetails 是服务器端的一种方法。你需要这样做:

<tr onclick="javascript:__doPostBack('_storeDetails','4');">

那么在服务器端,你需要这段代码:

if (this.IsPostBack)

    if (Request["__EVENTTARGET"] == "_storeDetails")
    
        // This can fail if you pass a value which is not an integer
        // You can use TryParse instead if you want.
        int param = int.Parse(Request["__EVENTARGUMENT"]);
        _storeDetails(param);
    

【讨论】:

【参考方案2】:

您正在尝试从客户端代码调用服务器端函数,在您的示例中这不起作用。您有几个选择:

执行回发并将所需控件设置为源。您需要创建一个客户端javascript函数:

&lt;tr onclick="_storeDetails(4)"&gt;

    <script type="text/javascript">
    function _storeDetails(parameter)
    
      __doPostBack('_storeDetailsClick', parameter)
    
    </script>

然后您可以在 Page_Load() 中处理回发。

使用网络方法:

 [WebMethod]
 public static void StoreDetails(int uid)
 
 

用 JavaScript 调用它:

PageMethods.SetName(parameterValue, onSuccess, onFail);

你需要初始化页面方法:

<asp:ScriptManager ID="ScriptMgr" runat="server" EnablePageMethods="true"></asp:ScriptManager>

全部在客户端进行。当然,这取决于您对发布的数据所做的工作。

【讨论】:

以上是关于为啥 C# 的 onClick 事件在表标签的 <td> 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C# onclick点击A标签

为啥div里的onclick()事件不起作用?不会jq

为啥div里的onclick()事件不起作用?不会jq

为啥我的验证事件没有在 C# 中触发?

为啥 bootstrap-vue 不渲染 onclick?

简单的a标签onclick,为啥无效呢?求解。。。。