2010-07-15 12 views
5

Ich habe eine Controller-Aktion, die eine große Menge an dynamischem JavaScript zurückgibt (wird einmal an den Client geliefert) und ich habe bereits die GZip-Komprimierung aktiviert. Eine Sache, die ich tun möchte, ist, den ausgeführten Ergebnisstrom zu lesen und JS-Minification darauf anzuwenden.Aktionsfilterattribut in ASP.NET MVC verkleinern

Ist dies mit einem Aktionsfilter-Attribut möglich? Ich denke, meine Frage läuft auf - Angenommen, mein Minifier nimmt eine Kette von JavaScript an. Gibt es eine Möglichkeit, das ausgeführte Ergebnis als String aus View(view).ExecuteResult(ControllerContext) zu ziehen?

+0

Haben Sie in Betracht gezogen, minify on publish? Sie können dies mit MS Build tun, das ist die, die wir verwenden http://code.google.com/p/antix-software/wiki/MSBuild –

+0

Es ist ein Nein diese Ergebnisse sind eigentlich SPARK Ansichten, die einfach JavaScript mit eingebettet sind C# (Lokalisierung, Standardwerte usw.). Sie müssen also dynamisch ausgeführt werden und können nicht vorminiert werden. Es muss nach der Ausführung sein. –

Antwort

4

Ich denke, der YUI Compressor für .NET wird genau das tun, was Sie brauchen.

http://yuicompressor.codeplex.com/

EDIT: Oben ist falsch, wie ich die Frage falsch verstanden. Der folgende Code installiert einen Antwortfilter, mit dem Sie die Ausgabe manipulieren können. In diesem Fall werden nur Zeilenumbrüche entfernt.

Hoffe, das hilft.

[HandleError] 
public class HomeController : Controller 
{ 
    [Minify] 
    public ActionResult Index() 
    { 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 
} 

public class Minify : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //You can check if the content type is CSS/JS here and prevent the filter running on HTML pages 

     filterContext.HttpContext.Response.Filter = new MinifyFilter(filterContext.HttpContext.Response.Filter); 

     base.OnActionExecuting(filterContext); 
    } 
} 

public class MinifyFilter : MemoryStream 
{ 
    private StringBuilder outputString = new StringBuilder(); 
    private Stream outputStream = null; 

    public MinifyFilter(Stream outputStream) 
    { 
     this.outputStream = outputStream; 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     outputString.Append(Encoding.UTF8.GetString(buffer)); 
    } 

    public override void Close() 
    { 
     //Call the minifier here, your data is in outputString 
     string result = outputString.ToString().Replace(Environment.NewLine, string.Empty); 

     byte[] rawResult = Encoding.UTF8.GetBytes(result); 
     outputStream.Write(rawResult, 0, rawResult.Length); 

     base.Close(); 
     outputStream.Close(); 
    } 
} 
+0

Ja, es wird die Minification durchführen, aber das war nicht meine Frage. Angenommen, ich habe ein Ergebnis wie 'View()' Ich möchte in der Lage sein, diesen Stream zu nehmen und ihn in String zu konvertieren, ihn zu verkleinern und in ein anderes Ergebnis zu schreiben (oder direkt in die Antwort) –

+0

Aah, tut mir leid, dass ich das falsch gelesen habe Frage. Sie benötigen einen Antwortfilter, den Sie innerhalb eines ActionFilter-Attributs anschließen können, ähnlich dem: http://StackOverflow.com/questions/1640909/asp-net-mvc-response-filter-outputcache-attribute – amarsuperstar

+0

Ich denke, das ist entlang die gleichen Zeilen aber ich denke immer noch nicht, dass es das gleiche Problem ist. Ich denke, es könnte als Filter (Stream) implementiert werden, obwohl ich mir nicht 100% ig sicher bin, wie ich das anstellen soll. –