我有一个自定义控件,它完全依赖于jquery插件。一切都按预期工作正常,但是当控件设置为Visible = false或其任何父项不可见时,就会出现问题。理想情况下,当asp.net控件设置为Visible false时,引擎不会呈现它,因此我的控件不会在页面加载上呈现。当控件没有呈现时,它不会加载javascript资源,因此当控件显示在回发时,jquery插件不会绑定。这是一个非常基本的问题,并且作为应该使用它的开发人员,他们只是将控件拖放到他们的页面上,假设它正在完美运行。我认为必须有一个解决方案。下面粘贴的是我如何加载资源。
ClientScriptManager cs = this.Page.ClientScript;
#region Loading JavaScript File(s)
string MenuPlugin = "MainMenuControl.Scripts.javascript_main.js";
cs.RegisterClientScriptResource(typeof(MainMenuControl.MenuControl), MenuPlugin);
string MenuInitializer = "MainMenuControl.Scripts.BuildMenu.js";
cs.RegisterClientScriptResource(typeof(MainMenuControl.MenuControl), MenuInitializer);
#endregion
#region Loading CSS File(s)
string cssUrl = Page.ClientScript.GetWebResourceUrl(this.GetType(), "MainMenuControl.Styles.MenuStyle.css");
HtmlLink cssLink = new HtmlLink();
cssLink.Href = cssUrl;
cssLink.Attributes.Add("rel", "stylesheet");
cssLink.Attributes.Add("type", "text/css");
this.Page.Header.Controls.Add(cssLink);
#endregion
#region Loading Image(s)
Page.ClientScript.GetWebResourceUrl(typeof(MainMenuControl.MenuControl), "MainMenuControl.Images.down.gif");
string script = string.Format(@"initializeMenu('{0}');", Page.ClientScript.GetWebResourceUrl(typeof(MainMenuControl.MenuControl), "MainMenuControl.Images.down.gif"));
Page.ClientScript.RegisterStartupScript(Page.GetType(), "InitImage", script, true);
#endregion
在代码的第三行,我正在调用一个正确加载图像网址的函数。但由于某种原因,javascript文件会加载,并且任何浏览器都没有在加载的资源列表中显示它们。
问题是否有任何解决方案,或者我做错了什么?我现在对这个问题真的很无奈,并希望得到任何帮助。
答案 0 :(得分:1)
我之前遇到了一个非常类似的问题,并遇到了你的问题。
我通过覆盖OnPreRender
方法为我的自定义控件加载了javascript。
protected override void OnPreRender(EventArgs e) {
base.OnPreRender(e);
Page.ClientScript.RegisterClientScriptInclude("MyJavascript", "MyURL");
}
这在普通页面环境中使用控件时起作用,但在这种情况下,我在更新面板中使用它并最初隐藏它。然后,来自更新面板的Ajax post backs会将Visible
属性更新为true。此时,ASP.NET无法自动将客户端脚本注入页面的<head>
。
解决方案
您可以覆盖OnPreRender
而不是覆盖OnInit
,即使在隐藏控件时也应始终触发此时间,您可以为任何Page
事件添加事件处理程序。这使您可以自由添加OnPreRender
方法,该方法将始终作为Page
生命周期的一部分执行。
protected override void OnInit(EventArgs e) {
base.OnInit(e);
Page.PreRender += new EventHandler(Page_PreRender);
}
protected void Page_PreRender(object sender, EventArgs e) {
Page.ClientScript.RegisterClientScriptInclude("MyJavascript", "MyURL");
}