Конвенция ASP.NET об объявлении клиентской стороны включает - PullRequest
2 голосов
/ 10 марта 2011

Я загружаю файлы .aspx и .ascx как StreamReader.

Я хочу, чтобы каждый файл регистрировал свои зависимости javascript и таблицы стилей в некотором объявлении, например <%@ ClientDependency path="~/Scripts/jquery-1.4.1.min.js" %>.

Существует ли существующее соглашение для таких действий? Мне не нужна реализация, но я не хочу создавать новый синтаксис, если уже есть способ сделать это.

Кроме того, каковы рекомендации для пользовательских <%@ блоков в ASP.NET?

Также, пожалуйста, пометьте этот вопрос, если вы можете придумать более подходящее описание.

Ответы [ 3 ]

1 голос
/ 10 марта 2011
0 голосов
/ 12 марта 2011

Не существует соглашения о регистрации клиента, включенного с директивой. Мое решение состояло в том, чтобы вместо этого создать пользовательский серверный элемент управления и использовать существующую функциональность TemplateParser для получения включаемых данных (что в итоге оказалось предпочтительнее, чем загрузка файла в виде потока и его синтаксический анализ самостоятельно).

0 голосов
/ 10 марта 2011

В основном ...

Вот что я делаю в своем текущем проекте MVC:

  • Использование Telerik Web Asset Manager для регистрациивсе мои обычные сценарии и CSS на главной странице, которые я знаю, будут использоваться на каждой странице (есть загрузка с открытым исходным кодом, если вы, как и я, не знали) .

  • Я инкапсулирую все функциональные возможности JS (за исключением нескольких строк) в функции, хранящиеся в соответствующих внешних файлах JS.

  • Я инкапсулирую все свои расширенные функциональные возможности пользовательского интерфейса в помощники HTML.Затем они используют StyleSheetRegistrar и ScriptsRegistrars для динамической загрузки любого дополнительного CSS или JS, которые требуются для этого конкретного помощника.И полагайтесь на то, что менеджер Telerik не загружает их более одного раза.

  • Если я когда-либо использую встроенные стили, я указываю тег стиля вручную внутри метода Helper через объект htmlAttributes, но егоредко.

  • Для того, чтобы вызвать мою функциональность javascript, необходимую для элемента HTML, я использую ScriptRegistrar (). OnDocumentReady () строковая перегрузка, чтобы указать javascriptфункция для вызова этого элемента.

  • Я также определил простой метод расширения для ScriptRegistrarBuilder в моем классе HtmlHelpers , который позволяет мнепредоставить список параметров для передачи моему вызову метода javascript при вызове OnDocumentReady () , без кучи конкатенации строк.

    public static void OnDocumentReady(this ScriptRegistrarBuilder builder, string format, params string[] args)
    {
        builder.OnDocumentReady(String.Format(format, args));
    }
    
  • И изКонечно, я рендерил все JS внизу главной страницы.

Вы не избегаете здесь всех видов использования встроенного JS, но это делает его довольно тонким, если вы делаете этоправо.Честно говоря, я не могу придумать другой способ, который не стал бы слишком сложным.

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

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

К сожалению, до сих пор не нашли способ обойти это.

Небольшой пример

Возможно, излишне подробный для вас ... но, таким образом, кто-то ищет, можно надеяться,найти полезное решение тоже!:)

На главной странице:

<%
    Html.Telerik().StyleSheetRegistrar().DefaultGroup(styles => styles
       .Add("~/Content/Site.css")
       .Add("~/Content/core.css")
    );

    Html.Telerik().ScriptsRegistrar().DefaultGroup(scripts => scripts
        .Add("~/Scripts/common.js")
        .Combine(true)
        .Compress(true)
        .CacheDurationInDays(30)
    );
%>

Затем где-то чуть выше закрывающего тега тела:

<%:
   Html.Telerik().ScriptsRegistrar().Render();
   Html.Telerik().StyleSheetsRegistrar().Render();
%>

Inваш HTML помощник:

    public static MvcHtmlString AutoCompleteComboListFor<TModel, TProperty>(this HtmlHelper<TModel> Helper, Expression<Func<TModel, TProperty>> expression,
        SelectList List, string DataSource)
    {
        MvcHtmlString dropDown = SelectExtensions.DropDownListFor<TModel, TProperty>(Helper, expression, List);

        string htmlFieldName = ExpressionHelper.GetExpressionText(expression);
        string id = Helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName);

        //Do whatever you want

        helper.Telerik().ScriptRegistrar().DefaultGroup(scripts => scripts
            .Add("~/Scripts/extended.js")
            );
        helper.Telerik().StyleSheetRegistrar().DefaultGroup(styles => styles
            .Add("~/Content/extended.css")
            );

        helper.Telerik().ScriptRegistrar().OnDocumentReady(@"MyExtendedFunction('{0}');", id);

        return dropDown;
    }

Простой вызов этого помощника (или любого другого) закончится блоком аккуратности в конце страницы, содержащей весь код JS, файлы и файлы CSS.

<link type="text/css" href="/Content/Site.css" rel="stylesheet"/>
<script type="text/javascript" src="/asset.axd?id=kAAAAB-LCAAAAAAABADsvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee--997o7nU4n99__P1xmZAFs9s5K2smeIYCqyB8_fnwfPyJ-8Uezjx597xd_tPro0Uevp3WxapuPRh-d82dL-uynf9E6r6-3d8f79N9P47vqo0c7v2Qk3-bv2nw5y2f2m91f8v1f8v3RR9OWvmzp27s_nV1mDcOlBpf06d7O7s743nj33u4BfTKl3u99ep9--ehRW6_zX_L_BAAA___9S_3qkAAAAA%3d%3d"></script>

<script type="text/javascript"> 
//<![CDATA[
jQuery(document).ready(function(){
myFunction('Foo');});
//]]>
</script>
...