2

我有一个外部 js 文件,它基本上是一个 js 对象。我正在使用 ScriptManager.RegisterClientScriptInclude 方法将文件包含在页面上,之后我使用 ScriptManager.RegisterClientScriptBlock 方法调用 js 对象的方法,但收到“未定义动态加载面板”的 js 错误。我知道当我在 aspx 页面中有方法调用时它是有效的,但我认为当 ScriptManager 注册脚本块时,我得到了计时的错误原因。我目前在 Page_Load 事件中有寄存器,下面是我的代码。有人可以帮我理解这里发生了什么。谢谢。


Page_Load 事件

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.ClientScript.IsClientScriptIncludeRegistered("DynamicLoadingPanel"))
        {
            ScriptManager.RegisterClientScriptInclude(Page, typeof(Page), "DynamicLoadingPanel", "~/dynamicLoadingPanel.js");
            ScriptManager.RegisterClientScriptBlock(Page, typeof(Page), "set_LoadingPanelID", "DynamicLoadingPanel.set_loadingPanelID('modalLayer');", true);
        }
    }
4

2 回答 2

4

经过几次尝试和错误,我终于找到了包含外部 js 文件的正确方法。因此,对于所有遇到此问题的人,我希望这可以为您节省几个令人沮丧的时间。

要包含您的文件,您必须获取当前 ScriptManager 的一个对象并将该文件添加到 Scripts 集合中。下面是一个例子。


ScriptManager sm = ScriptManager.GetCurrent(Page);
ScriptReference sr = new ScriptReference("~/scripts/dynamicLoadingPanel.js");
if (!sm.Scripts.Contains(sr))
    sm.Scripts.Add(sr);
于 2010-02-23T14:17:45.303 回答
0

或者你可以做这样的事情......

        /// <summary>
        /// Binds the name of the script by.
        /// </summary>
        /// <param name="control">
        /// The control.
        /// </param>
        /// <param name="scriptName">
        /// Name of the script.
        /// </param>
        public static void BindScriptByName(this Control control, string scriptName)
        {
            if (control.Page == null)
            {
                return;
            }

            var sm = ScriptManager.GetCurrent(control.Page);
            if (sm == null)
            {
                return;
            }

            if (sm.Scripts.Count(s => s.Name == scriptName) == 0)
            {
                sm.Scripts.Add(new ScriptReference { Name = scriptName });
            }
        }

        /// <summary>
        /// Registers the script definitions.
        /// </summary>
        /// <remarks>
        /// Call this on Application_Startup in Global.asax.
        /// </remarks>
        public static void RegisterScriptDefinitions()
        {
            var jqueryScriptResDef = new ScriptResourceDefinition
            {
                Path = "~/Scripts/jquery-1.4.2.min.js",
                DebugPath = "~/Scripts/jquery-1.4.2.js",
                CdnPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.min.js",
                CdnDebugPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.js"
            };
            ScriptManager.ScriptResourceMapping.AddDefinition("jQuery", jqueryScriptResDef);

            var jquerySuperFishMenuScriptResDef = new ScriptResourceDefinition
            {
                Path = "~/Scripts/jquery.superfishmenu.js",
                DebugPath = "~/Scripts/jquery.superfishmenu.js",
                CdnPath = "~/Scripts/jquery.superfishmenu.js",
                CdnDebugPath = "~/Scripts/jquery.superfishmenu.js"
            };
            ScriptManager.ScriptResourceMapping.AddDefinition("jQuery.SuperFishMenu", jquerySuperFishMenuScriptResDef);

            var jqueryIdTabsScriptResDef = new ScriptResourceDefinition
            {
                Path = "~/Scripts/jquery.idTabs.min.js",
                DebugPath = "~/Scripts/jquery.idTabs.min.js",
                CdnPath = "~/Scripts/jquery.idTabs.min.js",
                CdnDebugPath = "~/Scripts/jquery.idTabs.min.js",
            };
            ScriptManager.ScriptResourceMapping.AddDefinition("jQuery.idTabs", jqueryIdTabsScriptResDef);
        }

这使您可以在 Global.asax 中调用 RegisterScriptDefinitions,然后按名称加载它们... BindScriptByName("jQuery");

于 2010-08-05T06:22:47.373 回答