【问题标题】:Set runat="server" from JavaScript从 JavaScript 设置 runat="server"
【发布时间】:2014-07-08 21:20:17
【问题描述】:

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

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

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

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

  3. runat 属性赋予tabletbody,然后以某种方式引用其子项。这也会比 #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>
    );
});

【问题讨论】:

  • 投票者愿意详细说明吗?如果是我说的话,也许我可以改变它。谢谢。

标签: c# javascript jquery asp.net webforms


【解决方案1】:

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

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

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

【讨论】:

  • 大声笑,很高兴看到我们基本上回答了这个问题。
  • 呃,这就是我不喜欢遗留的东西:它没有包含有用的新东西,即使它非常有用。例如,PHP 可以合并对 DOM 的更改。
  • 是的,我根本不是 ASP.NET 的粉丝。现在肯定有更好的框架可供使用。
  • @MikeChristensen,是的,甚至 MVC 似乎也不如其他平台那么好。一般来说,我对 ASP.NET 的一个问题是它迫使事情处于更高的层次,这似乎也是这里的问题。
  • @trysis - 在大多数情况下,我只使用静态 HTML 并在 JavaScript 中实现所有逻辑。任何动态数据都来自对基于 JSON 的 Web 服务的 AJAX 请求。我尽量避免生成动态 HTML,因为它不能被缓存并减慢页面渲染速度。对于我的网站,我用 .NET 编写了自己的轻量级渲染引擎,完全绕过了 ASP.NET 框架。
【解决方案2】:
runat="server"

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

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 2012-06-25
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多