使ASP.NET捆绑为CSS捆绑指定media = screen
我只是尝试ASP.NET 4.5捆绑和缩小,并遇到了一个问题。
我有10个CSS文件,其中2个最初是在布局中使用属性media =“screen”引用的。
由于添加一个CSS的语法不允许你指定这样的属性应该被添加(有道理,因为该属性将适用于整个捆绑),我希望看到@ Styles.Render的重载将允许我指定html属性,就像其他的Html帮助器一样,但是没有。
有一个丑陋的解决scheme,其中,因为我知道所创build的包的URL,所以我可以自己制作标签,但是我会丢失由ASP.NET处理的caching机制,允许它呈现标签本身。
有没有办法做到这一点,我错过了什么? 或者这只是devise团队的疏忽?
我find了一个更优雅的解决scheme。
我正在使用Styles.RenderFormat(format, bundle)
。
我有一个名为PRINT
的属性的BundlesFormats
类,我用它像这样:
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")
嗯,这是一个丑陋的黑客,但希望团队将添加一个内置的方式来做到这一点,在下一个版本。
这是我如何解决它,维护cachingstring,仍然能够添加媒体属性到标签。
@{ var cssMediaBundleUrl = BundleTable.Bundles.ResolveBundleUrl("~/stylesheets/mediacss", true); } <link href="@cssMediaBundleUrl" rel="stylesheet" type="text/css" media="screen" />
猜猜我可以把它变成一个Html帮手,稍后会做,并编辑。
在不影响debugging能力的情况下解决这个问题的另一种方法是:
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属性附加到标签的末尾(在debugging模式下)或仅附加链接标签的末尾(当缩小/捆绑被启用时)。
在视图中的用法:
@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/
不幸的是,目前还没有一个很好的方法来描述标签的呈现方式,我们考虑添加一个钩子,以便您可以添加自己的方法来呈现每个脚本/样式标签。 听起来我们确实需要这样做。 应该是非常简单的添加,我会创build一个工作项目,以启用这种情况下…
作为一个临时的解决方法,如果你愿意失去Styles.Render给你的debugging/发布function,你可以使用Styles.Url来渲染对这个bundle的引用,这会给你一个bundle url,你可以把它embedded你的自己的标签。
为什么不使用@media打印? 看看http://www.phpied.com/5-years-later-print-css-still-sucks/
Web表单解决scheme
在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();
如此复杂,为什么不使用:
bundles.Add<StylesheetBundle>("~/Css/site.css", b => b.Media = "screen");
?