Добавление стилей и сценариев в веб-элементы управления 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 - это то, что приходит на помощь.

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

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?

Спасибо


person Andry    schedule 16.06.2011    source источник


Ответы (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(тип, ключ, скрипт)
  • 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.

person Tim Schmelter    schedule 16.06.2011
comment
ОК, Тим, ЭТО устарело, необходимо использовать Page.ClientScript, смотрите мои правки, потому что мой вопрос теперь превращается в этот... - person Andry; 17.06.2011
comment
@Tim: Ну, я не пробовал ... Visual Studio дала мне такое плохое уведомление об использовании устаревшего элемента, ахаха :) однако я думаю, что правильный способ - использовать ClientScript, который конкретно обрабатывает эти проблемы. Однако спасибо, без вас я не смог бы найти элементы, которые сейчас отображаются в разделе редактирования моего вопроса. - person Andry; 17.06.2011
comment
@Tim: Это работает с css и javascript???? По msdn нашел, но ваше описание намного лучше, вроде поддерживается только javascript. - person Andry; 17.06.2011
comment
@ Как я уже говорил, это была всего лишь идея. Вы пробовали, но это не работает? - person Tim Schmelter; 17.06.2011
comment
@Tim: с javascript работает, но это не очень хорошо для CSS... Что ж, кажется, нет возможности использовать таблицу стилей и включать ее на страницу..... - person Andry; 17.06.2011
comment
@Andry: взгляните на мои опубликованные ссылки, там могут быть некоторые рабочие подходы, также опубликован пример. - person Tim Schmelter; 17.06.2011
comment
@Tim Да, в конце концов, это невозможно ... нужно вручную вставить стиль ... однако я думаю, что это нехорошо ... Microsoft может немного поработать над этим :). Тим, ты был очень полезен, спасибо за твое время и терпение :) - person Andry; 18.06.2011