2010-07-15 8 views
5

Tengo una acción de controlador que devuelve una gran cantidad de JavaScript dinámico (se sirve una vez para el cliente) y ya tengo habilitada la compresión GZip. Una cosa que me gustaría hacer es leer el flujo de resultados ejecutados y aplicar la minificación de JS en él.Minificar atributo de filtro de acción en ASP.NET MVC

Es posible hacer esto utilizando un Atributo de filtro de acción. Creo que mi pregunta se reduce a: Suponiendo que mi minificador toma una cadena de JavaScript, ¿hay alguna forma de extraer el resultado ejecutado como una cadena de View(view).ExecuteResult(ControllerContext)?

+0

¿Ha considerado minify on publish? Puedes hacer esto usando ms build, este es el que usamos http://code.google.com/p/antix-software/wiki/MSBuild –

+0

Es un no va, estos resultados son en realidad vistas SPARK que son simplemente JavaScript con incrustado C# (localización, valores predeterminados, etc.). Por lo tanto, deben ejecutarse de forma dinámica y no pueden preminificarse. Necesita ser post ejecución. –

Respuesta

4

Creo que el compresor YUI para .NET hará exactamente lo que necesita.

http://yuicompressor.codeplex.com/

EDITAR: Por encima está mal como yo leído mal la pregunta. El siguiente código instalará un filtro de respuesta que le permite manipular la salida, en este caso simplemente elimina los caracteres de nueva línea.

Espero que esto ayude.

[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í, realizará la minificación pero esa no era mi pregunta. Suponiendo que tengo un resultado como 'View()', quiero poder tomar esa secuencia y convertirla a cadena, minify y escribirla en otro resultado (o directamente a la respuesta si es necesario) –

+0

Aah, lo siento, leí mal la pregunta. Necesita un filtro de respuesta que pueda conectar dentro de un Atributo de ActionFilter, similar a este: http://stackoverflow.com/questions/1640909/asp-net-mvc-response-filter-outputcache-attribute – amarsuperstar

+0

Creo que está a lo largo de las mismas líneas, sin embargo, todavía no creo que sea el mismo problema. Supongo que podría implementarse como un filtro (transmisión), aunque no estoy 100% seguro de cómo hacerlo. –

Cuestiones relacionadas