使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");