Пользовательский элемент управления: сценарии не загружаются, когда элемент управления скрыт при загрузке страницы
У меня есть пользовательский элемент управления, который полностью зависит от плагинов 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 не загружаются, и ни один браузер не показывает их в списке загруженных ресурсов.
Есть ли какое-то решение проблемы, или я что-то не так делаю? Я действительно беспомощен в этой проблеме сейчас и был бы признателен за любую помощь.
1 ответ
У меня раньше была очень похожая проблема, и я столкнулся с вашим вопросом.
Я загружал JavaScript для моего пользовательского элемента управления, переопределяя OnPreRender
метод.
protected override void OnPreRender(EventArgs e) {
base.OnPreRender(e);
Page.ClientScript.RegisterClientScriptInclude("MyJavascript", "MyURL");
}
Это сработало при использовании элемента управления в обычной среде страниц, но в этом случае я использовал его внутри панели обновления и изначально скрывал его. Ajax посты обратно с панели обновления будут обновлять Visible
свойство к истине. На данный момент, конечно, 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");
}