2

隐藏我有一个自定义控制未加载脚本,这完全依赖于jQuery插件。一切正常,因为它应该是,但问题出现时控制设置可见= false或其父母的任何不可见。理想情况下,当asp.net控件设置为可见时,引擎不会渲染它,所以我的控件不会在页面加载时呈现。并且,当控件不渲染时,它不会加载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 

在代码的第三行中,我正在调用带有正确加载的图像url的函数。但出于某种原因,JavaScript文件并没有被加载,也没有任何浏览器在加载的资源列表中显示它们。

是否有任何解决问题的办法,或者是有什么我做错了吗?我现在对这个问题真的很无奈,希望得到任何帮助。

回答

1

我有一个非常类似的问题早,在你的问题就来了。

我被重写OnPreRender方法加载JavaScript为我的自定义控件。

protected override void OnPreRender(EventArgs e) { 
     base.OnPreRender(e); 
     Page.ClientScript.RegisterClientScriptInclude("MyJavascript", "MyURL"); 
    } 

这用在正常的页面环境的控制,当工作过,但在这种情况下,我是用它的更新面板内,起初隐藏它。然后,更新面板中的Ajax回发将更新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"); 
    } 
+0

非常感谢您的回答。这个问题还没有解决,今天有一段时间会尝试。 –