Программно добавление файла Javascript в User Control в .net

Как вы добавляете Javascript файл программно в пользовательский элемент управления?

Я хочу, чтобы пользовательский элемент управления был полным пакетом, т.е. я не хочу добавлять javascript, который связан с пользовательским элементом управления на странице, где он использовался, когда я могу сделать это внутри самого элемента управления.

Так как в пользовательском элементе нет объекта страницы, как бы вы это сделали?

Ответ 1

В методе Page_Load файла control.ascx.cs:

LiteralControl jsResource = new LiteralControl();
jsResource.Text = "<script type=\"text/javascript\" src=\"js/mini-template-control.js\"></script>";
Page.Header.Controls.Add(jsResource);

HtmlLink stylesLink = new HtmlLink();
stylesLink.Attributes["rel"] = "stylesheet";
stylesLink.Attributes["type"] = "text/css";
stylesLink.Href = "css/mini-template-control.css";
Page.Header.Controls.Add(stylesLink);

Это загрузит css и Javascript в главный тег главной страницы, просто убедитесь, что голова имеет runat = "server".

Ответ 2

Вы можете зарегистрировать клиента script, используя ClientScriptManager. Страница доступна через свойство Control.Page.

Page.ClientScript.RegisterClientScriptInclude (
  typeof ( MyControl ), "includeme.js", "js/includeme.js"  );

EDIT: Извините, за общий "полный пакет", его возможные сценарии использования в качестве встроенных ресурсов, и получить динамический URL-адрес через обработчик WebResource.axd. Если это не считается полностью полным, то я предполагаю, что он может быть помещен в App_LocalResources, но он никогда не будет просто одним файлом, если код и script не являются строковыми.

Ответ 4

На моем сайте я разместил все необходимые скрипты и стили для размещенияHolder

<asp:placeHolder runat="Server" ID="phHead">
    <script src="/header/widget/script.js" type="text/javascript"></script>
    <link href="/header/widget/style.css" rel="stylesheet" type="text/css" />
</asp:placeHolder>

и

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Page.Header.Controls.Add(phHead)
End Sub

Ответ 5

Хороший вопрос!

Пользователь UserControl должен быть одним пакетом без какой-либо зависимости от JavaScript или CSS файла. Вам нужно будет сделать JS и CSS файлы вложенными ресурсами. Щелкните правой кнопкой мыши свойства и установите действие сборки для встроенных ресурсов. Затем вам нужно вставить файлы JavaScript и CSS в качестве WebResources.

Вот одна статья, которую я написал вчера, которая рассказывает об одном и том же сценарии:

http://highoncoding.com/Articles/502_Creating_RadioButton_Validation_Using_Custom_Validator.aspx

Ответ 6

Обычно я делаю это при рендеринге HTML для элемента управления и в зависимости от того, является ли он инъекцией библиотеки или инкапсулированием экземпляра, я использую коллекцию Items, чтобы указать, был ли я уже создан код для управления этим типом во время текущий запрос с использованием уникального идентификатора.

Что-то вроде:

    protected override void Render(HtmlTextWriter writer)
    {
        base.Render(writer);

        //Check if the Object Script has already been rendered during this request.
        if (!Context.Items.Contains("xxx"))
        {
            //Specify that the Object Script has been rendered during this request.
            Context.Items.Add("xxx", string.Empty);
            //Write the script to the page via the control
            writer.Write([libraryinjection]);
        }
        //Write the script that instantiates a new instance for this control
        writer.Write([instanceinjection]);
    }

Ответ 7

Если у вас есть текст фактического javascript в вашем .CS файле, вы можете вызвать page.ClientScript.RegisterClientScriptBlock.

Далее предполагается, что "GetScript()" возвращает фактический javascript, который вы хотите добавить к визуализированному элементу управления.

Page.ClientScript.RegisterClientScriptBlock(GetType(), "controlScriptName", GetScript());

Ответ 8

Я нашел, что это более элегантный способ исправить ссылку на ваш javascript.
В вашем .ascx, соединитесь с вашими файлами script следующим образом:

<script src='<%= ResolveClientUrl("~/Scripts/jquery-1.7.1.min.js") %>' type="text/javascript"></script>
<script src='<%= ResolveClientUrl("~/Scripts/jquery.maskedinput-1.3.min.js") %>' type="text/javascript"></script>

Таким образом, независимо от того, в какую вложенную папку/страницу вы добавляете свой пользовательский элемент управления, ссылка на ваши сценарии всегда будет правильно решена.