Asp.net 在服务器端级别呈现javascript。好主意还是坏主意?
现在是一个社区维基 我想先澄清一下:这不是一个与服务器端Javascript或运行Javascript服务器端相关的问题。这是一个关于从服务器端代码呈现Javascript代码(将在客户端执行)的问题 话虽如此,以下面的ASP.net代码为例: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
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浏览器页面,继续调试,而无需停止和重新启动调试器