2010-07-15 15 views
5

Çok sayıda dinamik JavaScript döndüren bir denetleyici eylemim var (istemciye bir kez sunulur) ve zaten GZip sıkıştırması etkin. Yapmak istediğim bir şey yürütülen sonuç akışını okumak ve bunun üzerine JS minification uygulamak.ASP.NET MVC'deki Eylem Filtresi Niteliğini Küçült

Bunu bir Eylem Filtresi Özniteliği kullanarak yapmak mümkün müdür. Sanırım sorumum kaynamaya devam ediyor - Madenciliğin bir JavaScript dizisi aldığını varsayarsak, yürütülen sonucu View(view).ExecuteResult(ControllerContext) dışında bir ip olarak çekmenin bir yolu var mı?

+0

Yayınlamayı minimize ettiniz mi? Bunu ms derlemesini kullanarak yapabilirsiniz, http://code.google.com/p/antix-software/wiki/MSBuild –

+0

'u kullandığımız budur. Bu sonuç aslında gömülü JavaScript'tir. C# (yerelleştirme, varsayılan değerler vb.). Bu yüzden dinamik olarak çalıştırılmalı ve önceden minimize edilemezler. Post yürütme olmalı. –

cevap

4

.NET için YUI Kompresörü ihtiyacınız olanı tam olarak yapacağını düşünüyorum.

http://yuicompressor.codeplex.com/

DÜZENLEME: Soru oynanırsa olarak Üstü yanlıştır. Aşağıdaki kod, çıkışı değiştirmenize izin veren bir yanıt filtresi kuracaktır, bu durumda yeni satır karakterlerini kaldırır.

Bu yardımcı olur umarım.

[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

Evet, minifikasyonu gerçekleştirecek ama bu benim sorum değildi. "View()" gibi bir sonuca sahip olduğumu varsayarak, bu akışı alabilmek ve dizgeye dönüştürmek, küçültmek ve başka bir sonuca (veya gerekirse cevaba doğrudan) yazmak istiyorum –

+0

Aah, üzgünüm soru. Buna benzer bir ActionFilter Attribute içinde bağlayabileceğiniz bir yanıt filtresine ihtiyacınız vardır: http://stackoverflow.com/questions/1640909/asp-net-mvc-response-filter-outputcache-attribute – amarsuperstar

+0

Yine de aynı hatlar hala aynı sorun olduğunu düşünmüyorum. Bir filtre (akış) olarak uygulanabileceğini tahmin etsem de,% 100 emin değilim. –

İlgili konular