我创建了一个源自LinkButton的asp.net Server控件,并向页面呈现一个小的javascript函数。
我想在页面上多次使用此控件,但只想在页面上呈现一次javascript。另一方面,我宁愿不在js文件中手动添加它,因为我不希望将来忘记添加js文件。
这样做最好的方法是什么?
答案 0 :(得分:10)
使用Page.ClientScript.RegisterClientScriptBlock(..)等注册方法。有几个重载,但它们都以类似的方式工作。无论从哪个控件实例发出多少控件实例,它都足够智能地呈现脚本。
Microsoft remarks in the MSDN documentation:
唯一标识客户端脚本 按键及其类型。脚本用 考虑相同的密钥和类型 重复。只有一个脚本 给定的类型和密钥对可以 在页面上注册。的尝试 注册已经存在的脚本 注册不会创建副本 脚本。
MSDN文档还包含示例代码,例如:
// Check to see if the client script is already registered.
if (!cs.IsClientScriptBlockRegistered(cstype, csname2))
{
StringBuilder cstext2 = new StringBuilder();
cstext2.Append("<script type=text/javascript> function DoClick() {");
cstext2.Append("Form1.Message.value='Text from client script.'} </");
cstext2.Append("script>");
cs.RegisterClientScriptBlock(cstype, csname2, cstext2.ToString(), false);
}
可以使用不同的方法以不同的方式注册客户端脚本 - 有关每个方法的更多详细信息,请参阅每个ClientScriptManager.RegisterClientScript*(..) methods in MSDN。它们都是为了防止渲染页面中的重复而构建的。
这使您可以自由地在控件级别输出脚本,而无需担心或不必跟踪或计算脚本。
修改强>
通过Page.ClientScript属性访问ClientScriptManager实例。
答案 1 :(得分:0)
您可以使用Page.RegisterClientScriptBlock方法。
以下是MSDN的一个示例:
if (!this.IsClientScriptBlockRegistered("clientScript"))
{
// Form the script that is to be registered at client side.
String scriptString = "<script language=\"JavaScript\"> function DoClick() {";
scriptString += "myForm.show.value='Welcome to Microsoft .NET'}<";
scriptString += "/";
scriptString += "script>";
this.RegisterClientScriptBlock("clientScript", scriptString);
}
HTH
答案 2 :(得分:0)
是否可以在CDN上引用脚本而不是多次重复?或者我可以不担心它,因为它只是一个指针而且浏览器(?)足够聪明,不能加载同一个库两次?
换句话说,假设我想从服务器控件插入以下代码:
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
如果我使用RegisterClientScriptBlock,我可以使用IsClientScriptBlockRegistered方法让服务器控件多次加载它。但是,前面的代码很可能已被另一个(不同的)服务器控件或想要在服务器控件之外使用jQuery的开发人员放在页面上。
如果开发人员已加载脚本,如何让服务器控件不加载脚本?