设置runat =" server"来自JavaScript

时间:2014-07-08 21:20:17

标签: c# javascript jquery asp.net webforms

有没有办法从客户端JavaScript设置runat属性?我需要在页面加载后向表中添加行,并且我需要创建他们的单元格'服务器可用的数据。我可以制作第一个(几个)行runat="server",但我不知道用户想要多少行,所以这不仅仅是添加一堆隐藏的行并显示当用户点击"添加新行"代替。

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

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

  2. 使用jQuery将runat="server"添加到单元格,然后在下次回发时引用它们,但当前不执行任何操作。这对我来说是理想的解决方案,但我不确定ASP.NET是否以这种方式工作。考虑到WebForms是在JavaScript开发人员开始考虑我们可以在页面加载之后向页面添加元素之后创建的,我不会屏住呼吸。

  3. 提供tabletbody runat属性,然后以某种方式引用其子项。这也比#1好,但我也不确定如何做到这一点,或者即使它确实可以做到。

  4. 以下是我想要做的简化版本:

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

2 个答案:

答案 0 :(得分:5)

这没有任何意义,因为当回发页面时,DOM的更改不会推回到服务器。添加对浏览器毫无意义的属性(例如runat)不会产生任何影响。即使您的表格设置为runat="server",服务器也不会检测到该表格的客户端更改。

选项#1(每次添加新行时回发)可能是最简单的方法,基本上是自1.0版本以来ASP.NET(在web-apps开始流行之前)设计的内容

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

答案 1 :(得分:3)

runat="server"

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