2010-07-15 16 views
5

में एक्शन फ़िल्टर विशेषता को कम करें मेरे पास एक नियंत्रक क्रिया है जो बड़ी मात्रा में गतिशील जावास्क्रिप्ट लौटाती है (क्लाइंट को एक बार सेवा दी जाती है) और मेरे पास पहले से ही GZip संपीड़न सक्षम है। एक चीज जो मैं करना चाहता हूं उसे निष्पादित परिणाम स्ट्रीम पढ़ा जाता है और उस पर जेएस मिनीफिकेशन लागू होता है।एएसपी.नेट एमवीसी

क्या एक्शन फ़िल्टर विशेषता का उपयोग करके ऐसा करना संभव है। मुझे लगता है कि मेरा प्रश्न नीचे उबलता है - मेरा मिनीफायर मानते हुए जावास्क्रिप्ट की एक स्ट्रिंग लेती है क्या निष्पादित परिणाम को View(view).ExecuteResult(ControllerContext) से बाहर स्ट्रिंग के रूप में खींचने का कोई तरीका है?

+0

क्या आपने प्रकाशित होने पर minify माना है? आप एमएस बिल्ड का उपयोग करके ऐसा कर सकते हैं, यह वह है जिसे हम http://code.google.com/p/antix-software/wiki/MSBuild –

+0

उपयोग करते हैं, यह कोई नहीं है कि ये परिणाम वास्तव में स्पार्क दृश्य हैं जो एम्बेडेड के साथ जावास्क्रिप्ट हैं सी # (स्थानीयकरण, डिफ़ॉल्ट मान आदि)। इसलिए उन्हें गतिशील रूप से निष्पादित करने की आवश्यकता है और पूर्व-निर्धारित नहीं किया जा सकता है। इसे पोस्ट निष्पादित करने की आवश्यकता है। –

उत्तर

4

मुझे लगता है कि .NET के लिए वाईयूआई कंप्रेसर आपको वही करेगा जो आपको चाहिए।

http://yuicompressor.codeplex.com/

संपादित: के रूप में मैं प्रश्न पढ़ने में भूलना ऊपर गलत है। नीचे दिया गया कोड एक प्रतिक्रिया फ़िल्टर स्थापित करेगा जो आपको आउटपुट में हेरफेर करने की इजाजत देता है, इस मामले में यह केवल न्यूलाइन अक्षरों को हटा देता है।

उम्मीद है कि इससे मदद मिलती है।

[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

हां यह खनन करेगा लेकिन यह मेरा प्रश्न नहीं था। मान लीजिए कि मेरे पास 'व्यू()' का नतीजा है, मैं उस स्ट्रीम को लेने में सक्षम होना चाहता हूं और इसे स्ट्रिंग में परिवर्तित करना चाहता हूं, इसे किसी अन्य परिणाम पर वापस भेज सकता हूं (या यदि आवश्यक हो तो सीधे प्रतिक्रिया के लिए) –

+0

आह, क्षमा करें, मैंने गलत तरीके से पढ़ा सवाल। आपको एक प्रतिक्रिया फ़िल्टर की आवश्यकता है जिसे आप एक्शनफिल्टर एट्रिब्यूट के भीतर हुक अप कर सकते हैं: http://stackoverflow.com/questions/1640909/asp-net-mvc-response-filter-outputcache-attribute – amarsuperstar

+0

मुझे लगता है कि साथ है वही लाइनें हालांकि मुझे अभी भी नहीं लगता कि यह एक ही मुद्दा है। मुझे लगता है कि इसे फ़िल्टर (स्ट्रीम) के रूप में कार्यान्वित किया जा सकता है, हालांकि मुझे 100% यकीन नहीं है कि इसके बारे में कैसे जाना है। –

संबंधित मुद्दे