2010-07-15 2 views
5

J'ai une action de contrôleur qui renvoie une grande quantité de JavaScript dynamique (est servi une fois au client) et j'ai déjà la compression GZip activée. Une chose que je voudrais faire est de lire le flux de résultat exécuté et d'appliquer une minification JS dessus. Est-il possible de le faire en utilisant un attribut de filtre d'action. Je pense que ma question se résume à - En supposant que mon minifier prend une chaîne de JavaScript est-il un moyen de tirer le résultat exécuté sous la forme d'une chaîne sur View(view).ExecuteResult(ControllerContext)?Réduire l'attribut de filtre d'action dans ASP.NET MVC

+0

Avez-vous considéré minimiser lors de la publication? Vous pouvez le faire en utilisant ms build, c'est celui que nous utilisons http://code.google.com/p/antix-software/wiki/MSBuild –

+0

Il s'agit d'un non aller ces résultats sont en fait des vues SPARK qui sont simplement JavaScript avec intégré C# (localisation, valeurs par défaut, etc.). Ils doivent donc être exécutés dynamiquement et ne peuvent pas être pré-minifiés. Il doit être post-exécuter. –

Répondre

4

Je pense que le compresseur YUI pour .NET fera exactement ce dont vous avez besoin.

http://yuicompressor.codeplex.com/

EDIT: Au-dessus est faux que j'ai mal lu la question. Le code ci-dessous va installer un filtre de réponse vous permettant de manipuler la sortie, dans ce cas il supprime simplement les caractères de nouvelle ligne.

Espérons que cela aide.

[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

Oui, il va effectuer la minification, mais ce n'était pas ma question. En supposant que j'ai un résultat comme 'View()' je veux être en mesure de prendre ce flux et de le convertir en chaîne, minify et l'écrire à un autre résultat (ou directement à la réponse si nécessaire) –

+0

Aah, désolé j'ai mal lu le question. Vous avez besoin d'un filtre de réponse que vous pouvez connecter dans un attribut ActionFilter, similaire à ceci: http://stackoverflow.com/questions/1640909/asp-net-mvc-response-filter-outputcache-attribute – amarsuperstar

+0

Je pense que c'est le cas les mêmes lignes mais je ne pense toujours pas que c'est le même problème. Je suppose que cela pourrait être implémenté en tant que filtre (stream) bien que je ne sois pas sûr à 100% de ce qu'il faut faire. –

Questions connexes