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

Сделайте пакет ASP.NET, укажите media = screen для набора CSS

Я просто пытаюсь собрать и минимизировать ASP.NET 4.5 и столкнулся с проблемой.

У меня есть около 10 файлов css, из которых 2 были указаны в макете с использованием атрибута media = "screen".

Поскольку синтаксис добавления css в пакет не позволяет указать, что такой атрибут должен быть добавлен (имеет смысл, поскольку атрибут будет применяться для всего пакета), я надеялся увидеть перегрузку @Styles. Render, который позволит мне указывать html-атрибуты, как и в других помощниках Html, но их нет.

Существует уродливое решение, в котором, поскольку я знаю URL-адрес созданного пакета, я мог бы просто создать сам тег, но я потерял бы механизм кэширования, который обрабатывается ASP.NET, позволяя ему отображать сам тег.

Есть ли способ сделать это, я что-то упустил? Или это просто надзор над командой разработчиков?

4b9b3361

Ответ 1

Я нашел более элегантное решение.

Я использую Styles.RenderFormat(format, bundle).

У меня есть класс BundlesFormats со свойством PRINT, и я использую его так:

public class BundlesFormats
{
    public const string PRINT = @"<link href=""{0}"" rel=""stylesheet"" type=""text/css"" media=""print"" />";
}

И в cshtml:

@Styles.RenderFormat(BundlesFormats.PRINT, "~/bundles/Content/print")

Ответ 2

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

Вот как я это решил, поддерживая строку кэширования и все еще могу добавить атрибут media к тегу.

@{
    var cssMediaBundleUrl = BundleTable.Bundles.ResolveBundleUrl("~/stylesheets/mediacss", true);
}
<link href="@cssMediaBundleUrl" rel="stylesheet" type="text/css" media="screen" />

Угадайте, я могу превратить это в помощника Html, сделаю это позже и отредактируем.

Ответ 3

Другим вариантом решения этой проблемы без ущерба для возможностей отладки может быть:

public static IHtmlString Render(string path, IDictionary<string, object> htmlAttributes)
{
    var attributes = BuildHtmlStringFrom(htmlAttributes);

#if DEBUG
    var originalHtml = Styles.Render(path).ToHtmlString();
    string tagsWithAttributes = originalHtml.Replace("/>", attributes + "/>");
    return MvcHtmlString.Create(tagsWithAttributes);
#endif

    string tagWithAttribute = string.Format(
        "<link rel=\"stylesheet\" href=\"{0}\" type=\"text/css\"{1} />", 
        Styles.Url(path), attributes);

    return MvcHtmlString.Create(tagWithAttribute);
}

То, что я делаю, просто добавляет атрибуты html к концам тегов (в режиме отладки) или к концу единственного тега ссылки (при включении/объединении).

Использование в представлениях:

@Bundles.Render("~/css/print", new { media = "print" })

Остальная часть кода:

public static IHtmlString Render(string path, object htmlAttributes)
{
    return Render(path, new RouteValueDictionary(htmlAttributes));
}

private static string BuildHtmlStringFrom(IEnumerable<KeyValuePair<string, object>> htmlAttributes)
{
    var builder = new StringBuilder();

    foreach (var attribute in htmlAttributes)
    {
        builder.AppendFormat(" {0}=\"{1}\"", attribute.Key, attribute.Value);
    }

    return builder.ToString();
}

Я написал сообщение в блоге об этой теме: http://danielcorreia.net/blog/quick-start-to-mvc4-bundling/

Ответ 4

К сожалению, нет отличного способа привязать теги к визуализации в настоящее время, мы подумали о добавлении крюка, чтобы вы могли добавить свой собственный метод для отображения каждого тега script/style. Похоже, нам нужно это сделать. Должно быть довольно просто добавить, я создам рабочий элемент, чтобы включить этот сценарий...

Как временный обходной путь, если вы хотите потерять функциональные возможности отладки/выпуска, которые предоставляет Styles.Render, вы можете отобразить ссылку на комплект с помощью Styles.Url, который предоставит вам только URL-адрес пакета, вы можете вставлять что внутри вашего собственного тега.

Ответ 6

Решение для веб-форм

В BundleConfig.cs:

//Print css must be a separate bundle since we are going to render it with a media=print
Bundles.Add(new StyleBundle("~/bundles/printCSS").Include("~/Content/Print.css"));

Мастер-страница:

<asp:Literal runat="server" ID="litCssPrint" />

Файл кода главной страницы:

litCssPrint.Text = Styles.RenderFormat(@"<link href=""{0}"" rel=""stylesheet"" type=""text/css"" media=""print"" />", "~/bundles/printCSS").ToHtmlString();

Ответ 7

Так сложно, почему бы не использовать:

bundles.Add<StylesheetBundle>("~/Css/site.css", b => b.Media = "screen");

?