Asp.Net: пользовательские элементы управления, библиотеки JavaScript и библиотеки JavaScript

0

У меня есть пользовательский элемент управления, для которого требуется Javascript/Jquery для каждого элемента управления. На самом деле это элемент управления для представления данных графически с использованием некоторой библиотеки javascript. Как норма, все мои ссылки javascript расположены в нижней части страницы на главной странице. Это означает, что я не могу писать javascript в элементе управления, потому что он появится перед любыми его зависимостями. Кроме того, даже если скрипт расположен в нижней части страницы, он работает только для первого элемента управления. Кто-нибудь сталкивался с подобными проблемами? Я ищу выход. благодаря

  • 0
    Возможно, вам придется добавить более подробную информацию со спецификой, в противном случае, похоже, что существуют ответы. stackoverflow.com/questions/1703601/...

2 ответа

1
Лучший ответ

У меня была аналогичная проблема "обновления" унаследованного сайта, в котором было множество встроенных 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>

Это отлично работает для меня, но если кто-нибудь знает лучший/более чистый способ, я бы хотел знать!

  • 0
    ... и да, я знаю, что лучшим / более чистым способом было бы удалить все эти встроенные JS в реальные файлы сценариев и просто использовать RegisterStartupScript ... но с количеством JS и такими вещами, как блоки кода в JS, было быстрее принять этот подход.
  • 0
    Я бы попробовал это немедленно. Я еще не решил эту проблему.
Показать ещё 4 комментария
2

Вы можете регистрировать клиентские скрипты из кода.

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>.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню