Помощник по регистрации скриптов и CSS в ASP.NET MVC? - PullRequest
10 голосов
/ 26 ноября 2008

Я некоторое время пытался использовать ASP.NET MVC, затем я столкнулся с проблемой, заключающейся в том, что я не хочу включать все мои js и css в главную страницу. Но как я могу зарегистрировать его в заголовке главной страницы из моего конкретного представления?

Ответы [ 8 ]

10 голосов
/ 27 ноября 2008

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

<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server" />
</head>

Затем ваши взгляды могут поместить в голову все, что захотят:

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <script src="Scripts/myScripts.js" type="text/javascript"></script>
    <link href="Styles/myStyles.css" rel="stylesheet" type="text/css" />
</asp:Content>
5 голосов
/ 09 апреля 2009

Не похоже, что есть простая опция, «встроенная» в ASP.NET MVC. Если вы используете пользовательский элемент управления (.ascx), которым вы можете быть, если вы создаете автономные элементы управления, которые также хотят управлять своими собственными требованиями JavaScript, то вы даже не сможете использовать заполнители, чтобы выручить вас.

В конце концов я создал вспомогательный класс и в нем есть пара методов:

private static SortedList<int, string> GetRegisteredScriptIncludes()
{
    var registeredScriptIncludes = System.Web.HttpContext.Current.Items["RegisteredScriptIncludes"] as SortedList<int, string>;

    if (registeredScriptIncludes == null)
    {
        registeredScriptIncludes = new SortedList<int, string>();
        System.Web.HttpContext.Current.Items["RegisteredScriptIncludes"] = registeredScriptIncludes;
    }

    return registeredScriptIncludes;
}

public static void RegisterScriptInclude(this HtmlHelper htmlhelper, string script)
{
    var registeredScriptIncludes = GetRegisteredScriptIncludes();
    if (!registeredScriptIncludes.ContainsValue(script))
    {
        registeredScriptIncludes.Add(registeredScriptIncludes.Count, script);
    }
}

public static string RenderScripts(this HtmlHelper htmlhelper)
{
    var registeredScriptIncludes = GetRegisteredScriptIncludes();
    var scripts = new StringBuilder();
    foreach (string script in registeredScriptIncludes.Values)
    {
        scripts.AppendLine("<script src='" + script + "' type='text/javascript'></script>");
    }
    return scripts.ToString();
}

В любом случае, это основная форма, чтобы попытаться показать, как это работает. Его можно улучшить многими способами, но в данный момент он просто отфильтровывает дубликаты запросов на вставку сценария для вас. Всякий раз, когда вы хотите добавить новый скрипт в ascx (или aspx в этом отношении), вы можете сделать это следующим образом:

<%
    Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/MapLayer.js"));
    Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/Vehicles.js"));
%>

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

<%=Html.RenderScripts() %>

Кажется, до сих пор работает для меня. Я почти не ожидал, что возникнут проблемы с рендерингом, в зависимости от того, в какой момент вызывался RenderScripts, особенно если еще не все из RegisterScriptInclude были вызваны, но пока, похоже, это делает работу. Если вы выполняете сценарии последними, у вас не должно быть проблем.

4 голосов
/ 20 мая 2009

@ Джейсон: ВНИМАНИЕ, вы не должны использовать статические переменные, подобные этой ... В веб-контексте статические переменные являются общими для всех пользователей и всех запросов страниц. Я поражен, что у вас не было проблем с вашим кодом. Принцип в порядке, но код неверен и доставит вам неприятности. В этом случае вы должны использовать System.Web.HttpContext.Current.Items. Подробнее см. http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx.

2 голосов
/ 15 июля 2009

Вот решение, подобное тому, которое дал Джейсон, но учитывает комментарии vdh_ant:

http://frugalcoder.us/post/2009/06/29/Handling-Scripts-in-ASPNet-MVC.aspx

0 голосов
/ 04 апреля 2012

Я написал именно такого менеджера для MVC и написал об этом в своем блоге:

"JavascriptHelper – Управление файлами JS для ASP.NET MVC"

ОБНОВЛЕНИЕ: я добавил комплектацию: «JavascriptHelper: управление файлами JS для ASP.NET MVC (с комплектацией)»

0 голосов
/ 11 декабря 2009

Mathew,

Я заглянул в ваш блог с помощниками Html.Css и Html.Script. Я не хочу быть критичным, но я не вижу упоминаний в блоге о том, как помощники Css и Script будут решать проблему, обсуждаемую здесь. Проблема здесь заключается в необходимости «регистрировать» ссылки на скрипты в любой точке во время процесса рендеринга и, возможно, несколько раз (в случае шаблона или частичного представления, которое используется несколько раз и регистрирует свои собственные скрипты), а затем выводить совокупные результаты без дубликатов в одном месте.

Если ваше решение решает эту проблему, пожалуйста, исправьте меня с некоторыми уточнениями.

- С уважением, Кен

0 голосов
/ 20 ноября 2009

MVC Futures теперь имеет встроенных помощников для этого ...

1.<head>
2.    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
3.    <%= Html.Css("BlueTheme/site.css") %>
4.    <%= Html.Script("jquery-1.3.2.js") %>
5.</head>

Больше информации здесь: http://blog.osbornm.com/archive/2009/10/12/mvc-script-css-helpers.aspx

0 голосов
/ 26 ноября 2008

технически вы должны поместить все свои js внизу страницы для лучшей производительности.

Я думаю, что единственный способ сделать это - включить JavaScript в VIewData и отобразить ViewData на главной странице (не очень хорошее решение).

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