在实现IScriptControl.GetScriptReferences时,如何指定脚本呈现给页面的顺序?

时间:2011-06-28 06:10:33

标签: asp.net asp.net-ajax scriptmanager dependency-management

在使用IScriptControl接口实现自定义控件时,如何指定脚本呈现给页面的顺序?

以下是我正在做的事情的一个例子:

public class MyScriptControl : WebControl, IScriptControl
{
    private static ConcurrentBag<ScriptReference> ScriptReferences;

    static MyScriptControl()
    {
        ScriptReferences = new ConcurrentBag<ScriptReference>
        {
            new ScriptReference { Name = "jquery" },
            new ScriptReference { Name = "jquery-ui" },
            new ScriptReference { Name = "myscriptcontrol" }
        };
        ScriptManager.ScriptResourceMapping.AddDefinition("myscriptcontrol",
            new ScriptResourceDefinition
            {
                ResourceAssembly = Assembly.GetCallingAssembly(),
                ResourceName = "Path.To.Scripts.myscriptcontrol.js"
            }
        );
    }

    public MyScriptControl()
    { }

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        ScriptManager.GetCurrent(Page)
            .RegisterScriptControl<MyScriptControl>(this);
    }

    protected override void Render(HtmlTextWriter writer)
    {
        // Render UI
    }

    public IEnumerable<ScriptReference> GetScriptReferences()
    {
        foreach (var reference in ScriptReferences)
        {
            yield return reference; 
        }
    }

    public IEnumerable<ScriptDescriptor> GetScriptDescriptors()
    {
        return new ScriptDescriptor[] { };
    }
}

上面的代码会产生问题,因为它在呈现jQuery脚本引用之前呈现jQueryUI脚本引用。如果我更改顺序,脚本将以正确的顺序呈现:

ScriptReferences = new ConcurrentBag<ScriptReference>
{
    new ScriptReference { Name = "myscriptcontrol" },
    new ScriptReference { Name = "jquery-ui" },
    new ScriptReference { Name = "jquery" }
};

这对于单个控件来说非常棒,但是我正在开发许多内部控件,其中一些内部控件将依赖于jQuery或其他库,我想确保无论控件的哪个组合都呈现给页面,脚本引用以正确的顺序呈现,以避免任何依赖性问题。

除了弄清楚如何规定依赖脚本的顺序之外,请随意撕掉您在此处看到的任何不良做法或问题代码。

1 个答案:

答案 0 :(得分:0)

不一定是声明确定顺序的脚本的顺序。如果您有许多脚本和许多DocumentReady函数,因为Jquery循环并处理每个DocumentReady函数块,如果文档尚未就绪,它会将函数推送到等待堆栈。如果文档准备就绪,它会立即处理该功能。因此,DocReady调用第一个包含的内容总是可能最后执行,而最后一个包含将首先执行,因为在文档最终准备就绪时会在最后执行。

这篇文章很好地解释了它,并为它提出了一个解决方法:

Change Execution Order of DocumentReady