Программно добавление файла 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 не являются строковыми.
Ответ 3
То же, что и gnomixa, только немного чище:
HtmlGenericControl js = new HtmlGenericControl("script");
js.Attributes["type"] = "text/javascript";
js.Attributes["src"] = "jscript/formfunctions.js";
Page.Header.Controls.Add(js);
из http://www.aspdotnetfaq.com/Faq/How-to-Programmatically-add-JavaScript-File-to-Asp-Net-page.aspx
Ответ 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>
Таким образом, независимо от того, в какую вложенную папку/страницу вы добавляете свой пользовательский элемент управления, ссылка на ваши сценарии всегда будет правильно решена.