设置 runat= "server" 来自 JavaScript



是否有办法从客户端JavaScript设置runat属性?我需要在加载页面后将行添加到表中,并且需要使其单元格的数据可供服务器使用。我可以使第一(一对)行(s) runat="server",但我不知道有多少行用户会想要,所以这不仅仅是一个问题,添加一堆隐藏行,并显示他们当用户点击"添加新行"代替。

我可以想到两种方法:

  1. 每次用户点击"添加新行"按钮时回发到页面,并在服务器上处理runat属性,而不是在JavaScript/jQuery中处理。我不想这么做,但这似乎是唯一可靠的方法,我可能不得不这么做。

  2. 用jQuery将runat="server"添加到单元格中,然后在下次我进行回发时引用它们,但目前对它们不做任何操作。这将是我的理想解决方案,但我不确定是否ASP。NET是这样工作的。考虑到WebForms是在JavaScript开发者有了在页面加载后添加元素的想法之前创建的,我并没有屏住呼吸

  3. table或者tbody一个runat属性,然后以某种方式引用它的子属性。这也会比第一条更好,但我也不确定如何做到这一点,或者即使它确实可以做到。

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

<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(每次添加新行时回发)可能是最简单的方法。. NET从1.0版本开始(在web应用变得流行之前)

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

runat="server"

…是一个服务器指令参数,对浏览器没有任何意义。在将页面呈现为HTML并将其发送到客户机浏览器之前,服务器将基于该指令的任何方法连接起来。当JS可以对元素进行更改并设置runat="server"时,服务器将无法接收该指令。

最新更新