Добавление стилей и сценариев в веб-элементы управления ASP.NET (ascx) без повторения директив включения - PullRequest
13 голосов
/ 17 июня 2011

Рассмотрим разработку веб-элемента управления (ASP.NET).То, что вы действительно хотели бы сделать, это разработать и разработать этот элемент управления очень хорошим способом, вот очень хороший способ сделать это (это то, как я хотел бы сделать, далее в этом вопросе я объясню, почему я не могу сделать это).

Программный подход

1) Я создаю свой элемент управления в отдельной папке с именем WebControls и называю его (например) MyWebControl.У меня будут эти файлы: MyWebControl.ascx и MyWebControl.ascx.cs.

2) Учитывая, что мой элемент управления является сложным элементом управления, я связываю стиль и динамическое поведение клиента, ссылаясь в html элемента управления на таблицу стилей CSS, которая называетсяMyWebControl.ascx.css и файл javascript с именем MyWebControl.ascx.js.

3) В моем контроле я делаю следующее:

<%@ Control Language="C#" 
            AutoEventWireup="true" 
            CodeFile="MyWebControl.ascx.cs" 
            Inherits="MyApp.WebControls.MyWebControl" %>

<link href="MyWebControl.ascx.css" rel="stylesheet" type="text/css" />
<script src="MyWebControl.ascx.js" type="text/javascript"></script>

<div>
...
</div>

Вот оно!

Проблема

Что ж, в этом есть проблема: когда мой элемент управления отображается, и на странице имеется более одного элемента управления, я получаю ссылки на файлы css и js, дублируемые или даже повторяющиеся.чем один раз.

Как связать внешнюю таблицу стилей / файл javascript в моем элементе управления, не встречаясь в этом плохом материале?

EDIT

Хорошо, немного посмотрев, спомогая другим людям здесь, в сообществе, я мог понять, что Page.ClientScript - это то, что приходит на помощь.

Однако существует много функций для регистрации сценария ... Можете ли вы заметить разницу?среди них?

1)Page.ClientScript.IsClientScriptBlockRegistered

2) Page.ClientScript.IsClientScriptIncludeRegistered

3) Page.ClientScript.IsOnSubmitStatementRegistered

4) Page.ClientScript.IsStartupScriptRegistered

И соответствующие методы набора?

1) Page.ClientScript.RegisterClientScriptBlock

2) Page.ClientScript.RegisterClientScriptInclude

3) Page.ClientScript.RegisterOnSubmitStatement

4) Page.ClientScript.RegisterStartupScript

Кроме того:это можно применить к javascript и css тоже?

Спасибо

1 Ответ

8 голосов
/ 17 июня 2011

Одна мысль: разве нельзя будет использовать ClientScriptManager.RegisterClientScriptBlock для внедрения импорта css-файла?

Что-то вроде (не проверено):

if(! Page.ClientScript.IsClientScriptBlockRegistered("MyWebControl.ascx.css"))
{
    Page.ClientScript.RegisterClientScriptBlock(this.getType(),"MyWebControl.ascx.css",@"<style type=""text/css"" src=""MyWebControl.ascx.css""></style>");
}

Отредактировано для изменения RegisterStartupScript на RegisterClientScriptBlock

Согласно вашим правкам:

  • RegisterStartupScript (тип, ключ, скрипт)
  • RegisterClientScriptBlock (тип, ключ, скрипт)

Разница между этими двумя методами заключается в том, что каждый из них генерирует блок скрипта. RegisterClientScriptBlock() испускает блок скрипта в начале веб-формы (сразу после тега), а RegisterStartupScript() испускает блок скрипта в конце веб-формы (прямо перед тегом).

Чтобы лучше понять, почему существует два разных метода для создания сценария на стороне клиента, необходимо понять, что сценарий на стороне клиента можно разделить на два класса: код, предназначенный для немедленного запуска при загрузке страницы, и код, предназначенный для запускаться, когда происходит какое-либо клиентское событие. Типичным примером кода, предназначенного для запуска при загрузке страницы, является код на стороне клиента, предназначенный для установки фокуса на текстовое поле. Например, когда вы посещаете Google, при загрузке страницы выполняется небольшой фрагмент кода на стороне клиента, чтобы автоматически установить фокус на текстовое поле поиска.

http://msdn.microsoft.com/en-us/library/aa478975.aspx#aspnet-injectclientsidesc_topic2

Редактировать : из ваших комментариев я предполагаю, что это, к сожалению, не работает таким образом. Посмотрите на следующие ссылки:

Там могут быть некоторые рабочие подходы

Как подсказка, вы можете программно создать HtmlLink в Page_Init-Handler вашего UserControl:

Dim objLink As New HtmlLink();
objLink.ID = "MyWebControlascxcss";
objLink.Attributes("rel") = "stylesheet";
objLink.Attributes("type") = "text/css";
objLink.Href ="~/filname.css";
Page.Header.Controls.Add(objLink);

Не забудьте сначала проверить с помощью рекурсивной функции, была ли ссылка уже добавлена ​​в Page.Header.Controls- Collection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...