ScriptManager.RegisterClientScriptInclude之后的Javascript对象“未定义”错误

我有一个外部js文件,基本上是一个js对象。 我正在使用ScriptManager.RegisterClientScriptInclude方法在页面上包含该文件,之后我使用ScriptManager.RegisterClientScriptBlock方法来调用js对象的方法,但是得到了’DynamicLoadingPanel未定义’的js错误。 我知道方法调用在aspx页面中有效时会起作用,但我认为我在ScriptManager注册脚本块时遇到错误原因。 我目前在Page_Load事件中有Registers,下面是我的代码。 有人可以帮我理解这里发生了什么。 谢谢。

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); } } 

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

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

 ScriptManager sm = ScriptManager.GetCurrent(Page); ScriptReference sr = new ScriptReference("~/scripts/dynamicLoadingPanel.js"); if (!sm.Scripts.Contains(sr)) sm.Scripts.Add(sr); 

或者你可以做这样的事……

  ///  /// Binds the name of the script by. ///  ///  /// The control. ///  ///  /// Name of the script. ///  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 }); } } ///  /// Registers the script definitions. ///  ///  /// Call this on Application_Startup in Global.asax. ///  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,然后通过Name … BindScriptByName(“jQuery”)加载它们;

Interesting Posts