visual studio solicitar renderbody puede porque plantillas para net método mvc llama directamente bootstrap asp asp.net-mvc-4 bundling-and-minification asp.net-optimization

asp.net mvc 4 - studio - ¿Por qué MVC4 @ Styles.Render() no se comporta como se espera en el modo de depuración?



plantillas mvc visual studio 2017 (3)

Estoy implementando el soporte de agrupación y minificación en MVC4 y configurándolo para que pueda compilar mis archivos Bootstrap .less automáticamente para mí. Tengo el siguiente código en mi archivo BundleConfig.cs

public class BundleConfig { public static void RegisterBundles(BundleCollection bundles) { // base bundles that come with MVC 4 var bootstrapBundle = new Bundle("~/bundles/bootstrap").Include("~/Content/less/bootstrap.less"); bootstrapBundle.Transforms.Add(new TwitterBootstrapLessTransform()); bootstrapBundle.Transforms.Add(new CssMinify()); bundles.Add(bootstrapBundle); } }

El TwitterBootsrapLessTransform es el siguiente (es más complicado de lo que me gustaría debido a la necesidad de importar los archivos sub .less a dotLess)

public class TwitterBootstrapLessTransform : IBundleTransform { public static string BundlePath { get; private set; } public void Process(BundleContext context, BundleResponse response) { setBasePath(context); var config = new DotlessConfiguration(DotlessConfiguration.GetDefault()); config.LessSource = typeof(TwitterBootstrapLessMinifyBundleFileReader); response.Content = Less.Parse(response.Content, config); response.ContentType = "text/css"; } private void setBasePath(BundleContext context) { BundlePath = context.HttpContext.Server.MapPath("~/Content/less" + "/imports" + "/"); } } public class TwitterBootstrapLessMinifyBundleFileReader : IFileReader { public IPathResolver PathResolver { get; set; } private string basePath; public TwitterBootstrapLessMinifyBundleFileReader(): this(new RelativePathResolver()) { } public TwitterBootstrapLessMinifyBundleFileReader(IPathResolver pathResolver) { PathResolver = pathResolver; basePath = TwitterBootstrapLessTransform.BundlePath; } public bool DoesFileExist(string fileName) { fileName = PathResolver.GetFullPath(basePath + fileName); return File.Exists(fileName); } public byte[] GetBinaryFileContents(string fileName) { throw new System.NotImplementedException(); } public string GetFileContents(string fileName) { fileName = PathResolver.GetFullPath(basePath + fileName); return File.ReadAllText(fileName); } }

En mi página base _Layout.cshtml intenté renderizar los archivos css haciendo esto

@Styles.Render("~/bundles/bootstrap");

como lo sugiere el tutorial mvc, pero el archivo que el navegador del cliente termina solicitando es

http://localhost:53729/Content/less/bootstrap.less

lo que provoca un error. Si pongo el siguiente enlace en la página de diseño base, funciona como se espera.

<link href="~/bundles/bootstrap" rel="stylesheet" type="text/css" />

¿Por qué @ Styles.Render () no se comporta de la misma manera en el modo de depuración? Funciona en modo de lanzamiento. Puedo entender cómo no desea que se agrupen y minimicen en depuración, pero ¿cómo puedo forzar a este paquete para que funcione de la misma manera siempre?


Básicamente, cuando debug="true" , los métodos de Script / Style Render suponen que las Optimizaciones están desactivadas, lo que significa que no hay agrupación ni minimización, lo que significa que no se llamará a su transformación; en su lugar, solo generará enlaces a los contenidos sin procesar del paquete (que es boostrap.less en su caso).

Puede anular este comportamiento y ejecutar siempre la optimización configurando BundleTable.EnableOptimizations = true . Esto obligará a los métodos de renderización a realizar siempre la agrupación / minificación.


Evito esto dejando que dotless sirva el archivo .less

en web.config:

<handlers> <add name="dotless" path="*.less" verb="GET" type="dotless.Core.LessCssHttpHandler,dotless.Core" resourceType="File" preCondition="" /> </handlers>


Lo que terminé haciendo fue poner una declaración de depuración si en mi _Layout.cshtml para que el paquete se renderizara sin importar nada. No estoy loco por eso como una solución, pero está funcionando por ahora.

@if (Context.IsDebuggingEnabled) { <link href="~/bundles/bootstrap" rel="stylesheet" type="text/css" /> } else { @Styles.Render("~/bundles/bootstrap") }