从web
页面调用服务器端方法的能力是一个功能强大的特性。
但是,在应用程序中使用服务器端方法时,需要记住一些事情。
注意:在本节中,对于#server
所提到的任何内容也适用于#call
,除非另有说明。
#server
或#call
指令都可以从web
浏览器中的JavaScript
调用Caché
服务器上的方法。
这使得CSP
能够做一些事情,比如在移出字段时验证字段,而不是等待表单的提交,从而向用户提供即时反馈。
在使用#server
语法时,应该注意以下几个因素——否则可能会产生执行非常慢的应用程序,或者在某些情况下根本无法工作。
使用#server
时要记住两个基本规则:
onload
事件中使用#server
。Caché
中生成web
页面时,生成数据更快、更容易。onunload
事件中使用#server
。#server
调用,并在每个调用中做尽可能多的工作,因为它们开销很大,涉及到从浏览器到服务器的往返。这不是一个好主意的原因是,当从Caché
生成页面时,需要在onload
事件中运行的任何代码都可以更快、更容易地运行。
例如,假设为JavaScript
变量设置一个初始值,以便稍后在页面中使用(可能在#server
调用中)。
所以你现在正在做的是:
<html>
<head>
<script language="JavaScript">
function LoadEvent()
{
var value=#server(..GetValue())#;
}
</script>
</head>
<body onload=LoadEvent();>
</body>
</html>
<script language="Cache" method="GetValue" returntype="%String">
Quit %session.Data("value")
</script>
但是,完全没有必要调用#server
,因为JavaScript
变量的值在生成页面时已经在%session.Data("value")
中知道了。
因此,最好这样写:
<html>
<head>
<script language="JavaScript">
function LoadEvent()
{
var value='#(%session.Data("value"))#';
}
</script>
</head>
<body onload=LoadEvent();>
</body>
</html>
无论你在做什么,同样的技巧都适用,如果你在文档加载时更新表单元素的值,那么在页面生成时将其更改为将值放入,例如:
<input type="text" name="TextBox" value='#(%request.Get("Value"))#'>
在页面的onload
事件中不需要使用#server
。
因为页面正在卸载,所以很难知道从Caché
返回的JavaScript
是否会被执行,而实际的行为取决于浏览器。
另外,如果用户关闭了机器,则永远不会得到onunload
事件。
应用程序需要能够在任何情况下处理这种可能性,可能是通过在%session
对象上使用超时。
例如,可以将onunload
#server
逻辑代码移动到用户单击的下一个CSP
页面的开头。