Frage

Ich probiere gerade ASP.NET MVC 4 aus, kann aber nicht herausfinden, wie die Javascript / CSS-Minimierungsfunktion deaktiviert wird.Insbesondere für Entwicklungsumgebungen hilft dies beim Debuggen erheblich.Ich würde mir vorstellen, dass es sich um einen Wechsel in web.config handelt, aber da sich ASP.NET MVC 4 derzeit noch in der Beta-Phase befindet, gibt es wirklich nicht viele Informationen.Würde mich freuen, wenn jemand helfen oder auf die richtigen Blog-Beiträge usw. verweisen kann.

War es hilfreich?

Lösung

In Global.asax.cs

#if DEBUG
        foreach (var bundle in BundleTable.Bundles)
        {
            bundle.Transform = new NoTransform();
        }
#endif

Andere Tipps

Eine andere Option wäre, einen HTML-Helper zu erstellen, mit dem Sie das Skript und die Link-Tags erstellen können.Folgendes habe ich für das Javascript implementiert, was auch für das CSS möglich ist:

public static class BundleHelper
    {
        public static MvcHtmlString JsBundle(this HtmlHelper helper, string bundlePath)
        {
            var jsTag = new TagBuilder("script");
            jsTag.MergeAttribute("type", "text/javascript");

            return ReferenceBundle(helper, bundlePath, jsTag);
        }

        public static MvcHtmlString ReferenceBundle(this HtmlHelper helper, string bundlePath, TagBuilder baseTag)
        {
            var httpContext = helper.ViewContext.HttpContext;
            var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);

            Bundle bundle = BundleTable.Bundles.GetBundleFor(bundlePath);
            var htmlString = new StringBuilder();

            if (bundle != null)
            {
                var bundleContext = new BundleContext(helper.ViewContext.HttpContext, BundleTable.Bundles, urlHelper.Content(bundlePath));

                if (!httpContext.IsDebuggingEnabled)
                {
                    baseTag.MergeAttribute("href", System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(bundlePath));
                    return new MvcHtmlString(baseTag.ToString());
                }

                foreach (var file in bundle.EnumerateFiles(bundleContext))
                {
                    var basePath = httpContext.Server.MapPath("~/");
                    if (file.FullName.StartsWith(basePath))
                    {
                        var relPath = urlHelper.Content("~/" + file.FullName.Substring(basePath.Length));
                        baseTag.MergeAttribute("href", relPath, true);
                        htmlString.AppendLine(baseTag.ToString());
                    }
                }

            }

            return new MvcHtmlString(htmlString.ToString());
        }
    }

Jetzt müssen Sie es nur noch in Ihrer Ansicht aufrufen:

<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title - My ASP.NET MVC Application</title>
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <link href="~/Content/css" rel="stylesheet" type="text/css" />
    <link href="~/Content/themes/base/css" rel="stylesheet" type="text/css" />
    @Html.JsBundle("~/scripts/js")
    <meta name="viewport" content="width=device-width" />
</head>

Und es werden die Skripte als separate Referenzen gerendert oder die neue Bündelungs- / Minimierungsfunktion verwendet, je nachdem, welche Debug-Einstellung in Ihrer web.config enthalten ist.Ich habe einen Teil des Codes von http://codecutout.com/resource-minify-bundling als verwendetEine Referenz beim Erstellen meines Helfers, wenn Sie weitere Beispiele sehen möchten.Ihr Helfer ist etwas besser geschrieben und wirft Ausnahmen aus, wenn ungültige Argumente usw. geliefert werden. Ich bin nur noch nicht dazu gekommen, meine aufzuräumen.

Sie können Ihre eigenen Bundles in Global.asax registrieren und die Klasse NoTransform verwenden, wenn der Inhalt nicht minimiert werden soll.

Ich persönlich möchte nicht, dass mein Skript überhaupt transformiert wird.Ich erstelle nur zwei Skriptverzeichnisse.Eine mit den Debug-Skriptversionen und eine mit den ursprünglich heruntergeladenen minimierten Versionen.

Der sofort einsatzbereite MVC 4-Minifier (JsMinify) unterbricht jQuery 1.7.1 für Opera, daher möchte ich diesen nicht verwenden.Ich habe gerade die folgenden Zeilen in meine Global.asax eingefügt: Application_Start()-Methode:

Bundle debugScripts = new Bundle("~/DebugScripts", 
    new NoTransform("text/javascript"));
debugScripts.AddDirectory("~/Scripts/Debug", "*.js");
BundleTable.Bundles.Add(debugScripts);

Bundle productionScripts = new Bundle("~/ProductionScripts", 
    new NoTransform("text/javascript"));
productionScripts.AddDirectory("~/Scripts/Minified", "*.js");
BundleTable.Bundles.Add(productionScripts);

Damit kann ich einfach eine von zwei Zeilen in meinen _layouts.cshtml einfügen:

<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/DebugScripts")" type="text/javascript"></script>
<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/ProductionScripts")" type="text/javascript"></script>

Natürlich könnten wir damit ein bisschen funky werden.Wir könnten nur ein Bundle generieren und je nach erstelltem Typ auswählen, welche Dateien eingeschlossen werden sollen.

Nach dem Aufruf von EnableDefaultBundles() in Global.asax können Sie dies tun ...

        if ( ... running in development environment ...)
        {
            var registeredBundles = BundleTable.Bundles.GetRegisteredBundles();
            foreach (var bundle in registeredBundles)
            {
                if (bundle.Transform is System.Web.Optimization.JsMinify)
                    bundle.Transform = new NoTransform();
            }
        }

Nicht schön (vom System festgelegter Status ändern), aber es ist viel weniger Code als bei allen anderen Vorschlägen. Sie können dennoch das Standard-Bündelungsverhalten verwenden und es werden keine Änderungen an Ihren Ansichten vorgenommen.

In neueren Versionen von ASP.NET MVC fügen Sie einfach hinzu

#if DEBUG
            foreach (var bundle in BundleTable.Bundles)
            {
                bundle.Transforms.Clear();
            }
#endif

direkt nach

BundleConfig.RegisterBundles(...);

Sie können es über config: deaktivieren

<system.web>
    <compilation debug="true" />
    <!-- Lines removed for clarity. -->
</system.web>

http://www.asp.net/mvc/Tutorials / mvc-4 / Bündelung und Minifizierung

Ich denke, es wäre richtig, wenn eine solche Funktion "out of the box" verfügbar sein würde.

Ich habe ein Feedback zu UserVoice.com gepostet: http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/2702000-improve-system-web-optimization-bundle

Geben Sie Ihre "Stimmen".

Anstatt Instanzen von JsMinify und CssMinify zu ersetzen, können stattdessen Schnittstellen verwendet werden. Diese Option war in früheren Versionen nicht verfügbar, da der zweite Konstruktorparameter eher ein Typ als eine Schnittstelle war.

IBundleTransform jsTransform;
IBundleTransform cssTransform;

#if DEBUG
    jsTransform = new NoTransform("text/javascript");
    cssTransform = new NoTransform("text/css");
#else
    jsTransform = new JsMinify();
    cssTransform = new CssMinify();
#endif

Bundle jsBundle = new Bundle("~/JsB", jsTransform);
Bundle cssBundle = new Bundle("~/CssB", cssTransform);

Vielleicht auch erwähnenswert für Skripte, die mit minimierten und nicht minimierten Versionen geliefert werden, z.jQuery, man kann eine Hilfsmethode verwenden, um optional die ".min" für DEBUG-Builds zu entfernen, um das Debuggen zu erleichtern:

private string Min(string scriptNameIncludingMin)
{
#if DEBUG
    return scriptNameIncludingMin.Replace(".min", ""); // Remove .min from debug builds
#else
    return scriptNameIncludingMin;
#endif
}

// ...
jsBundle.AddFile(Min("~/Scripts/jquery-1.7.2.min.js"));

Probieren Sie eine neue Erweiterung für System.Web.Optimization aus - Bundle Transformer .In Bundle Transformer wurden eine Reihe von Möglichkeiten zur Vereinfachung des Debuggens implementiert (siehe Dokumentation ).

Eine weitere Alternative (getestet mit v1.1.0.0 und MVC5):

public class BundleConfig
{
    public static void Register()
    {
        ScriptBundle jsBundle = new ScriptBundle("~/Scripts/myscript.min.js");
        jsBundle.Include("~/Scripts/myscript.js");
        DisableInDebugMode(jsBundle);

        BundleTable.Bundles.Add(jsBundle);
    }

    private static void DisableInDebugMode(ScriptBundle jsBundle)
    {
    #if DEBUG
        // Don't minify in debug mode
        jsBundle.Transforms.Clear();
    #endif
    }
}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top