У меня есть пользовательский элемент управления, для которого требуется Javascript/Jquery для каждого элемента управления. На самом деле это элемент управления для представления данных графически с использованием некоторой библиотеки javascript. Как норма, все мои ссылки javascript расположены в нижней части страницы на главной странице. Это означает, что я не могу писать javascript в элементе управления, потому что он появится перед любыми его зависимостями. Кроме того, даже если скрипт расположен в нижней части страницы, он работает только для первого элемента управления. Кто-нибудь сталкивался с подобными проблемами? Я ищу выход. благодаря
У меня была аналогичная проблема "обновления" унаследованного сайта, в котором было множество встроенных JS... поэтому я также столкнулся с проблемами, когда я переместил jQuery и другие скрипты в нижней части страницы. Я решил это, добавив новый ContentPlaceHolder
на главную страницу, под другими ссылками на скрипт:
<asp:ContentPlaceHolder ID="ScriptsPlace" runat="server"></asp:ContentPlaceHolder>
</body>
Затем просмотрел страницы и переместил все встроенные JS в блок контента для ScriptsPlace
.
<asp:Content ID="Content5" ContentPlaceHolderID="ScriptsPlace" runat="server">
<script>
//some awesome JS
</script>
</asp:Content>
Хотя это не работает для пользовательских элементов управления... поэтому я сделал несколько хакерское решение, которое по существу включало в себя включение всех пользовательских элементов управления JS в div
именем _jsDiv
а затем из кода, перемещающего этот div в placeholder (I ' m не любит RegisterStartupScript
и это не практично для большого количества кода).
Поскольку я сделал это в нескольких элементах управления, я сделал следующие шаги:
Шаг 1. Создайте пользовательский элемент управления ScriptMoverUserControl.cs:
public class ScriptMoverUserControl : System.Web.UI.UserControl
{
protected void Page_PreRender(object sender, EventArgs e)
{
ContentPlaceHolder c = Page.Master.FindControl("ScriptsPlace") as ContentPlaceHolder;
HtmlGenericControl jsDiv = this.FindControl("_jsDiv") as HtmlGenericControl;
if (c != null && jsDiv != null)
{
jsDiv.ID = Guid.NewGuid().ToString(); //change the ID to avoid ID conflicts if more than one control on page is using this.
c.Controls.Add(jsDiv);
}
}
}
Шаг 2. Сделайте свой пользовательский контроль новым классом управления: он наследует ScriptMoverUserControl
вместо System.Web.UI.UserControl
public partial class SomeGreatControl : ScriptMoverUserControl
Шаг 3 - Сбросьте скрипты пользовательского управления в div с именем _jsDiv:
<div id="_jsDiv" runat="server">
<script>
//some awesome JS
</script>
</div>
Это отлично работает для меня, но если кто-нибудь знает лучший/более чистый способ, я бы хотел знать!
RegisterStartupScript
... но с количеством JS и такими вещами, как блоки кода в JS, было быстрее принять этот подход.
Вы можете регистрировать клиентские скрипты из кода.
var clientScriptManager = Page.ClientScript;
if(!clientScriptManager.IsStartupScriptRegistered("a_key")) { //If multiple control instances are present on the page, register scripts only once
RegisterStartupScript(Page.GetType(), "a_key", "<script src=\"/js/a_library.js\"></script>"));
}
RegisterStartupScript
добавит <script>
в самую нижнюю часть страницы, перед тегом закрытия </body>
.