2010-07-15 17 views
5

Ho un'azione controller che restituisce una grande quantità di JavaScript dinamico (viene pubblicata una volta sul client) e ho già attivato la compressione GZip. Una cosa che mi piacerebbe fare è leggere il flusso di risultati eseguito e applicare la minificazione JS su di esso.Attributo filtro azione minima in ASP.NET MVC

È possibile farlo utilizzando un attributo del filtro di azione. Penso che la mia domanda si riduce a - Supponendo che il mio minificatore prende una stringa di JavaScript c'è un modo per tirare il risultato eseguito come una stringa di View(view).ExecuteResult(ControllerContext)?

+0

Avete preso in considerazione la pubblicazione di minify? Puoi farlo utilizzando ms build, questo è quello che usiamo http://code.google.com/p/antix-software/wiki/MSBuild –

+0

È un no go questi risultati sono in realtà viste SPARK che sono semplicemente JavaScript con incorporato C# (localizzazione, valori predefiniti ecc.). Quindi hanno bisogno di essere eseguiti dinamicamente e non possono essere pre-minificati. Deve essere post eseguito. –

risposta

4

Penso che il compressore YUI per .NET farà esattamente quello che ti serve.

http://yuicompressor.codeplex.com/

EDIT: Sopra è sbagliato, come ho letto male la domanda. Il codice seguente installerà un filtro di risposta che consente di manipolare l'output, in questo caso rimuove solo i caratteri di nuova riga.

Spero che questo aiuti.

[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

Sì, eseguirà il minisito, ma quella non era la mia domanda. Supponendo che io abbia un risultato come 'View()' Voglio essere in grado di prendere quel flusso e convertirlo in stringa, ridimensionarlo e scriverlo su un altro risultato (o direttamente alla risposta se necessario) –

+0

Aah, scusa ho letto male il domanda. Hai bisogno di un filtro di risposta che puoi collegare a un attributo ActionFilter, simile a questo: http://stackoverflow.com/questions/1640909/asp-net-mvc-response-filter-outputcache-attribute – amarsuperstar

+0

Penso che sia lungo le stesse linee comunque non penso che sia lo stesso problema. Immagino che possa essere implementato come filtro (stream) anche se non sono sicuro al 100% come farlo. –

Problemi correlati