Сделайте пакет ASP.NET, укажите media = screen для набора CSS
Я просто пытаюсь собрать и минимизировать ASP.NET 4.5 и столкнулся с проблемой.
У меня есть около 10 файлов css, из которых 2 были указаны в макете с использованием атрибута media = "screen".
Поскольку синтаксис добавления css в пакет не позволяет указать, что такой атрибут должен быть добавлен (имеет смысл, поскольку атрибут будет применяться для всего пакета), я надеялся увидеть перегрузку @Styles. Render, который позволит мне указывать html-атрибуты, как и в других помощниках Html, но их нет.
Существует уродливое решение, в котором, поскольку я знаю URL-адрес созданного пакета, я мог бы просто создать сам тег, но я потерял бы механизм кэширования, который обрабатывается ASP.NET, позволяя ему отображать сам тег.
Есть ли способ сделать это, я что-то упустил? Или это просто надзор над командой разработчиков?
Ответы
Ответ 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-адрес пакета, вы можете вставлять что внутри вашего собственного тега.
Ответ 5
Почему бы просто не использовать печать @media? Проверьте http://www.phpied.com/5-years-later-print-css-still-sucks/
Ответ 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");
?