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

Script & Помощник по регистрации CSS в ASP.NET MVC?

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

4b9b3361

Ответ 1

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

<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>

Ответ 2

Пока не существует простой опции "встроенный" в 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();
}

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

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

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

<%=Html.RenderScripts() %>

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

Ответ 3

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

Mathew,

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

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

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