Asp.net 在服务器端级别呈现javascript。好主意还是坏主意?

Asp.net 在服务器端级别呈现javascript。好主意还是坏主意?,asp.net,javascript,jquery,server-side,serverside-javascript,Asp.net,Javascript,Jquery,Server Side,Serverside Javascript,现在是一个社区维基 我想先澄清一下:这不是一个与服务器端Javascript或运行Javascript服务器端相关的问题。这是一个关于从服务器端代码呈现Javascript代码(将在客户端执行)的问题 话虽如此,以下面的ASP.net代码为例: hlRemoveCategory.Attributes.Add("onclick", "return confirm('Are you sure you want to delete this?');") if (categoryCanBeDelete

现在是一个社区维基

我想先澄清一下:这不是一个与服务器端Javascript或运行Javascript服务器端相关的问题。这是一个关于从服务器端代码呈现Javascript代码(将在客户端执行)的问题

话虽如此,以下面的ASP.net代码为例:

hlRemoveCategory.Attributes.Add("onclick", "return confirm('Are you sure you want to delete this?');")
if (categoryCanBeDeleted) {
  hlRemoveCategory.Attributes.Add(
    "onclick",
    "return confirm('Are you sure you want to delete the " + categoryType + "?');"
  );
}
这是在服务器端规定客户端
onclick
事件

与在客户端编写Javascript相反:

$('a[rel=remove]').bind('click', function(event) {
    return confirm('Are you sure you want to delete this?');
}
现在我想问的问题是:从服务器端代码呈现javascript有什么好处?反之亦然

我个人更喜欢将客户端UI/行为与HTML元素连接起来的第二种方式,原因如下:

  • 服务器端已经做了它需要做的事情,包括数据验证、事件委派等;及
  • 服务器端视为事件的内容不一定是客户端上的同一进程。i、 例如,客户端上有更多的事件(只需查看自定义事件);及
  • 在一个事件中,客户端和服务器端发生的事情可能完全不相关且不耦合;及
  • 客户端发生的事情都发生在客户端,服务器不需要知道。服务器应该处理和运行提供给他们的内容,在发生客户端事件时,如何实现该过程实际上并不取决于他们;等等等等
这些显然是我的想法。我想知道其他人是怎么想的,是否有关于这个话题的讨论

从该参数分支的主题可以达到:

  • 代码管理:从服务器端渲染所有内容是否更容易
  • 关注点分离:如果将客户端逻辑与服务器端逻辑分离,会更容易吗
  • 效率:哪一个在编码和运行方面更高效
一天结束时,我正试图让我的团队朝着第二种方法前进。这支队伍中有很多老队员害怕这种变化。我只是想用正确的事实和数据说服他们

让我知道你的想法


更新1:看来我们所有参与这篇文章的人都有共同的想法;很高兴知道还有其他想法相似的人。现在去说服那些家伙;)谢谢大家。

你的第二个例子远远优于第一个例子。Javascript是您的行为层,应该与语义标记(内容)和CSS(表示)分开。这是一个更好的体系结构,原因有很多:

  • 鼓励逐步提高。正如您提到的,后端代码应该在没有JS的情况下正常工作。你不能指望你的客户有可用的JS。通过这种方式,您可以在不使用JS的情况下构建一次,然后可以增强使用JS的用户的体验(例如,通过添加客户端验证和服务器端验证,以便客户端可以获得即时反馈)
  • 更清晰的标记。通常减少下载大小。在一个单独的JS文件中有一个可重用的选择器,可以在页面之间缓存和共享,而不是每个元素上的处理程序
  • 所有JS都在一个重复使用的地方。e、 g.如果您的代码正在打开一个弹出窗口,并且您决定更改窗口的尺寸,那么您将在JS文件中的代码中更改一次,而不是在每个内联处理程序上更改它
还有很多其他的论点和理由,但它们应该让你开始


此外,从您的示例来看,您的文档中似乎有一个可以删除内容的普通链接。这也是一种不好的做法。任何删除或更新内容的操作都应该在POST(而不是GET)请求下完成。因此,它应该是提交表单的结果。否则,例如googlebot可能会通过抓取您的页面而意外删除您的所有内容(搜索引擎机器人不会执行JS,因此您的警报不会有帮助)

对于您示例中的代码,这并不重要。代码没有使用任何仅在服务器端可用的信息,因此在客户端代码中绑定事件同样容易

有时,您希望使用服务器端可用的一些信息来决定是否应添加事件,或为事件创建代码,例如:

hlRemoveCategory.Attributes.Add("onclick", "return confirm('Are you sure you want to delete this?');")
if (categoryCanBeDeleted) {
  hlRemoveCategory.Attributes.Add(
    "onclick",
    "return confirm('Are you sure you want to delete the " + categoryType + "?');"
  );
}
如果要在客户端执行此操作,则必须以某种方式将此信息放入页面中,以便客户端代码也可以访问它。

我能想到的两个最大的区别是:

  • 如果javascript位于单独的js文件中,则会丢失客户端缓存
  • 如果需要更改javascript,则必须重新编译(将此推断为发布产品后发生的情况:如果必须重新编译,则需要重新分发二进制文件,而不仅仅是修改过的js文件)
  • 如果javascript位于单独的文件中,则使用VS调试器更容易;您可以在该文件中设置断点,如果您正在生成代码服务器端,那么您必须使用running documents功能,找到生成的代码,然后添加断点,并且每次重新运行应用程序时都必须手动添加该断点。接下来,如果代码在一个单独的文件中,那么您可以调整javascript代码,F5浏览器页面,继续调试,而无需停止和重新启动调试器
应该提到的是,有时您必须从服务器插入js代码——例如,如果您的大部分代码都在一个单独的js文件中,您需要在页面中插入控件标识,以便代码使用。如果可能的话,尽量避免这种情况。