Подтвердить что ты не робот

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

Рассмотрите возможность создания веб-элемента управления (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 в моем элементе управления, не входя в этот плохой материал?

ИЗМЕНИТЬ

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

Тем не менее, существует множество функций для регистрации script... можете ли вы сказать о различии между ними?

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 тоже?

Thankyou

4b9b3361

Ответ 1

Одна мысль: нельзя ли использовать 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 (тип, ключ, script)
  • RegisterClientScriptBlock (тип, ключ, script)

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

Чтобы лучше понять, почему существуют два разных метода для испускания клиентской стороны script, убедитесь, что клиентская сторона script может быть разделена на два класса: код, который предназначен для немедленного запуска при загрузке страницы и код, который предназначен для запуска при возникновении какого-либо события на стороне клиента. Общим примером кода, который предназначен для запуска при загрузке страницы, является клиентский код, предназначенный для установки фокуса на текстовое поле. Например, когда вы посещаете 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.