如何管理Ajax Extender控件的javascript依赖项

时间:2011-09-07 04:23:31

标签: javascript asp.net dependency-management asp.net-controls extender

Ajax Extender控件库是否提供依赖关系管理?我正在创建一组控件,它们使用行为使用的一些基本脚本,并从这里Creating a Extender Control看起来我必须在每个控制代码中包含我的基本脚本。因此,扩展程序库为每个控件提供相同的脚本[缓存的脚本],或者为每个控件提供相同的脚本。

例如我正在开发依赖于jQuery的控件。由于我正在开发扩展程序控件,我将不得不从如下界面实现此方法,请注意jquery脚本!

protected override IEnumerable<ScriptReference> GetScriptReferences()
{
    ScriptReference reference = new ScriptReference();
    reference.Path = ResolveClientUrl("jQuery.js");
    reference.Path = ResolveClientUrl("FocusBehavior.js");
    return new ScriptReference[] { reference };
}

现在我将在另一个控件中使用相同的jquery脚本,这是否意味着如果两个控件都在同一页面中它们会被提供两次? 还有一个问题,

如何使扩展程序控件输出生产脚本而不是调试脚本 使用scriptmanager注册脚本对我来说也不是一个选项,因为我使用的页面不需要脚本管理器。

一些规格:

在VS2005中开发

.NET 2.0,ASP.NET 2.0

脚本依赖于Sizzle,emile.js,spine.js这些是所有控件所需的基本脚本

1 个答案:

答案 0 :(得分:0)

我相信ASP.NET框架在其呈现过程中可以正确处理重复的ScriptReference对象,因为ASP.NET控件可以存在于页面上的多个实例中。

例如,在ASP.NET页面中,您可以执行以下操作:

<act:Calendar runat="server" ID="calendar1"/>
<act:Calendar runat="server" ID="calendar2"/>

这两个控件都依赖于相同的脚本,但框架不会加载它们两次。

在您的情况下,您可能希望执行以下操作:

protected override IEnumerable<ScriptReference> GetScriptReferences()
{
    List<ScriptReference> references = new List<ScriptReference>();

    #if DEBUG
    // Load Debug Version
    references.Add(new ScriptReference(ResolveClientUrl("~/Path_To_Your_Debug_JS.js"));     
    #else
    // Load Minified Version
    references.Add(new ScriptReference(ResolveClientUrl("~/Path_To_Your_Release_JS.js"));
    #endif

    return references;
}

这应该允许您提供Javascript文件的Debug或Release(缩小)版本,具体取决于处于Debug或Release模式。

我不确定您对MasterPage的评论不需要ScriptManager。我假设您有某种处理ScriptManager职责的机制,比如在控件上调用GetScriptReferences()方法并处理这些脚本标记的呈现。