有没有一种方法可以从客户端JavaScript设置runat属性?页面加载后,我需要向表中添加行,并且需要使服务器的单元格数据可用。我可以将第一行(几行)设为runat="server",但是我不知道用户想要多少行,所以这不仅仅是添加一堆隐藏行并在何时显示它们的问题。用户则单击“添加新行”。

我可以想到几种方法来做到这一点:


每次用户单击“添加新行”按钮时回发到页面,并在服务器上而不是JavaScript / jQuery中处理服务器上的runat属性。我不想这样做,但似乎唯一当然,我可能必须这样做。
使用jQuery将runat="server"添加到单元格中,然后在下次执行回发时引用它们,但是当前不对其进行任何处理。这对我来说是理想的解决方案,但是我不确定ASP.NET是否以这种方式工作。考虑到WebForms是在JavaScript开发人员下手之前创建的,因此我们可以在页面加载后向页面中添加元素,这一点我没有屏息。
tabletbody赋予runat属性,然后以某种方式引用其子级。这也将比#1更好,但是我也不知道如何做到这一点,或者即使确实可以做到。


这是我想做的事情的简化版本:

<table runat="server" id="this_table">
    <tbody runat="server" id="this_table_body">
        <tr>
            <td class="this_table_cell">Some Content</td>
            <td><button type="button" class="this_table_button">Please click this button</button>
        </tr>
    </tbody>
</table>


以及jQuery的简化版本:

$("#<%=this_table_body.ClientID%>").on("click", ".this_table_button", function() {
    $("<%=this_table_body.ClientID%>").append("<tr>
            <td class="this_table_cell">Some Content</td>
            <td><button type="button" class="this_table_button">Please click this button</button>
        </tr>
    );
});

最佳答案

这没有任何意义,因为在页面回发时,不会将对DOM的更改回推回服务器。向浏览器添加绝对没有意义的属性(例如runat)不会有任何效果。即使您将表设置为runat="server",服务器也不会检测到对该表的客户端更改。

选项#1(每次添加新行时回发)可能是最简单的方法,并且基本上是ASP.NET从1.0版开始设计的功能(在Web应用变得流行之前)

为了获得更动态的体验,您需要做的是在本地存储客户端更改,然后通过标准表单元素(例如隐藏的输入字段)将其发布回服务器。您可以将任意数量的隐藏字段添加到<form>元素,并使用Request对象在服务器上读取它们。或者,您也许可以通过JSON或XML序列化新行数据。如果您只是想在数据库中保存新行,则可以实现“保存”按钮,该按钮通过AJAX将单个新行发送到服务器并立即保存。

关于c# - 从JavaScript设置runat =“server”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24641804/

10-09 17:33