2012-05-04 25 views
3

我有幾個Razor頁面,包含許多條件邏輯,循環,部分視圖等等。很容易使輸出標記語義上保持正確,但使用正確的縮進和換行符更難以格式化它。我怎麼能在運行時自動執行此操作?有沒有模塊或Razor擴展?如何使用縮進和換行自動格式化剃刀輸出?

請不要說右鍵單擊 - >格式選擇。爲了清楚起見,我想避免在寫Razor頁面時考慮格式化。我希望我的Razor標記能夠以對開發者有意義的方式進行佈局(例如,在服務器端塊內部縮進),但是對於單擊「查看源代碼」的奇怪人來說,呈現的HTML將被「修飾」。 (我並不擔心,因爲我用gzip /緊縮增加輸出的大小。)

回答

4

您可以像使用TidyNethttp://sourceforge.net/projects/tidynet/)圖書館,實施ActionFilter

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    if (filterContext.Result is ViewResult) 
    { 
     var tidy = new Tidy 
      { 
       Options = 
        { 
         DocType = DocType, 
         DropFontTags = DropFontTags, 
         LogicalEmphasis = LogicalEmphasis, 
         XmlOut = XmlOut, 
         Xhtml = Xhtml, 
         IndentContent = IndentContent, 
         HideEndTags = HideEndTags, 
         MakeClean = MakeClean, 
         TidyMark = TidyMark, 
        } 
       }; 

     filterContext.RequestContext.HttpContext.Response.Filter = 
      new HtmlTidyFilter(filterContext.RequestContext.HttpContext.Response.Filter, tidy); 
    } 
} 

過濾器的算法:

public override void Write(byte[] buffer, int offset, int count) 
{ 
    var data = new byte[count]; 
    Buffer.BlockCopy(buffer, offset, data, 0, count); 
    string html = Encoding.Default.GetString(buffer); 

    using (var input = new MemoryStream()) 
    { 
     using (var output = new MemoryStream()) 
     { 
      byte[] byteArray = Encoding.UTF8.GetBytes(html); 
      input.Write(byteArray, 0, byteArray.Length); 
      input.Position = 0; 
      _tidy.Parse(input, output, new TidyMessageCollection()); 

      string result = Encoding.UTF8.GetString(output.ToArray()); 

      byte[] outdata = Encoding.Default.GetBytes(result); 
      _stream.Write(outdata, 0, outdata.GetLength(0)); 
     } 
    } 
} 

然後你只需將它插到控制器:

[TidyHtml] 
public class AnyController : Controller 

Voilá! ;)

我從此源得知:http://blog.aquabirdconsulting.com/2009/10/28/asp-net-mvc-clean-html/

+0

它解決了你的問題嗎? –