asp.net服务器控件 - 避免添加多个javascript

时间:2010-01-26 07:46:10

标签: asp.net custom-server-controls

我创建了一个源自LinkBut​​ton的asp.net Server控件,并向页面呈现一个小的javascript函数。

我想在页面上多次使用此控件,但只想在页面上呈现一次javascript。另一方面,我宁愿不在js文件中手动添加它,因为我不希望将来忘记添加js文件。

这样做最好的方法是什么?

3 个答案:

答案 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的开发人员放在页面上。

如果开发人员已加载脚本,如何让服务器控件不加载脚本?