动态分配脚本引用

更新:2007 年 11 月

大多数情况下,将脚本文件添加到 ASP.NET 页中的最简单的方法是添加到标记中,如下面的示例所示:

<asp:ScriptManager ID="SMgr" runat="server">
  <Scripts>
    <asp:ScriptReference Path="./Script.js" />
  </Scripts>
</asp:ScriptManager> 

但也可以动态添加脚本引用。网页开发人员可以通过此方式在更大程度上控制如何添加脚本。例如,他们可以动态添加脚本以帮助保留内存资源,如在不需要时不加载大型脚本库。他们也可以为不同类型的用户加载不同版本的脚本。控件开发人员在创建脚本控件或扩展程序控件时可以动态添加脚本,以便使脚本资源可自动用于该控件所在的页。

本主题介绍了一个简单的网页开发人员方案。有关在自定义控件中添加脚本引用的信息,请参见创建扩展程序控件以将客户端行为与 Web 服务器控件关联

脚本引用可以指定脚本文件或在程序集中作为资源嵌入的脚本。脚本可以存在于调试版本和零售版本中。下面的过程演示在每种情况下如何为页指定脚本引用。

Bb398991.alert_note(zh-cn,VS.90).gif说明:

要向 ScriptManager 控件注册的所有脚本文件都必须调用 notifyScriptLoaded 方法,以通知应用程序脚本已完成加载。基于程序集的脚本在大多数情况下不应调用此方法。有关更多信息,请参见 Sys.Application.notifyScriptLoaded 方法

将脚本引用动态添加到页

  1. 如果您不知道页面上 <asp:ScriptManager> 元素的 ID,请调用 ScriptManager 控件的 ScriptManagerGetCurrent() 方法以获取该控件的当前实例。如果页面上没有 ScriptManager 控件,请测试 null。如果您知道页面上存在 <asp:ScriptManager> 元素,而且知道该元素的 ID 值,则可以跳过此步骤。

    下面的示例演示如何测试页面上是否存在 ScriptManager 控件,然后获取当前实例或创建新实例。

    ' If there is a ScriptManager on the page, use it.
    ' If not, throw an exception.
    Dim SMgr As ScriptManager
    If ScriptManager.GetCurrent(Page) Is Nothing Then
        Throw New Exception("ScriptManager not found.")
    Else : SMgr = ScriptManager.GetCurrent(Page)
    End If
    
    // If there is a ScriptManager on the page, use it.
    // If not, throw an exception.
    ScriptManager Smgr = ScriptManager.GetCurrent(Page);
    if (Smgr == null) throw new Exception("ScriptManager not found.");
    
  2. 创建 ScriptReference 对象。

    Dim SRef As ScriptReference
    SRef = New ScriptReference()
    
    ScriptReference SRef = new ScriptReference();
    
  3. 对于基于文件的脚本,如果您知道 ScriptManager 控件的 ScriptPath 属性已设置为正确的脚本文件位置,请将 ScriptReference 实例的 Name 属性设置为该脚本文件的名称。否则,将 ScriptReference 对象的 Path 属性设置为要添加的脚本文件的绝对、相对或相对于应用程序的 URL。

    ' If you know that Smgr.ScriptPath is correct...
    SRef.Name = "Script.js"
    
    ' Or, to specify an app-relative path...
    SRef.Path = "~/Scripts/Script.js"
    
    // If you know that Smgr.ScriptPath is correct...
    SRef.Name = "Script.js";
    
    // Or, to specify an app-relative path...
    SRef.Path = "~/Scripts/Script.js";
    
  4. 如果该脚本是程序集的一部分,请设置 ScriptReference 实例的 NameAssembly 属性。

    SRef.Name = "Script.js"
    SRef.Assembly = "ScriptAssembly"
    
    SRef.Name = "Script.js";
    SRef.Assembly = "ScriptAssembly";
    
  5. 指定是运行该脚本的调试版本还是发行版本。若要为页上的所有脚本设置此模式,请设置 ScriptManager 控件的 ScriptMode 属性。若要为单个脚本设置调试模式,请设置 ScriptReference 对象的 ScriptMode 属性。

    下面的示例演示了这两种模式。

    ' To set ScriptMode for all scripts on the page...
    SMgr.ScriptMode = ScriptMode.Release
    
    'Or, set ScriptMode for just for the one script...
    SRef.ScriptMode = ScriptMode.Debug
    
    'If they conflict, the setting on the ScriptReference wins.
    
    // To set ScriptMode for all scripts on the page...
    Smgr.ScriptMode = ScriptMode.Release;
    
    //Or, to set the ScriptMode just for the one script...
    SRef.ScriptMode = ScriptMode.Debug;
    
    //If they conflict, the setting on the ScriptReference wins.
    
    Bb398991.alert_note(zh-cn,VS.90).gif说明:

    如果未设置 ScriptReference 对象的 Path 属性,则默认情况下 ScriptManager 控件的 ScriptMode 属性设置为 Release。如果已设置 ScriptReference 对象的 Path 属性,则 ScriptManager 控件查找调试脚本和发布脚本两者,除非该控件的 ScriptMode 属性已设置为特定模式。

  6. ScriptReference 对象添加到 ScriptManager 控件的 Scripts 集合。

    SMgr.Scripts.Add(SRef)
    
    Smgr.Scripts.Add(SRef);
    

请参见

概念

创建扩展程序控件以将客户端行为与 Web 服务器控件关联

向 Web 服务器控件添加客户端功能

参考

ScriptReference

ScriptManager

ScriptMode