2

我有一个自定义控件,它完全依赖于 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

在代码的倒数第三行,我正在调用一个带有正确加载的图像 url 的函数。但由于某种原因,javascript 文件不会加载,并且任何浏览器都不会在加载的资源列表中显示它们。

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

4

1 回答 1

1

我之前有一个非常相似的问题,遇到了你的问题。

OnPreRender我正在通过覆盖该方法为我的自定义控件加载 javascript 。

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

这在正常页面环境中使用控件时有效,但在这种情况下,我在更新面板中使用它并最初隐藏它。然后,来自更新面板的 Ajax 回发会将Visible属性更新为 true。当然,此时 ASP.NET 没有机会将客户端脚本自动注入到<head>页面中。

解决方案

此时您可以将事件处理程序添加到任何事件,而不是覆盖OnPreRender您可以覆盖(即使控件被隐藏也应该始终触发) 。这使您可以自由地添加一个始终作为生命周期的一部分执行的方法。OnInitPageOnPreRenderPage

    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");
    }
于 2013-10-04T09:34:18.383 回答