2014-01-17 37 views
1

比方說,我有以下的自定義擴展到System.Web.Mvc.HtmlHelper<T>在自定義維護當前縮進MVC HTML的擴展幫助

public static MvcHtmlString WrapInDiv<TModel, TValue>(this HtmlHelper<TModel> html, String text) 
{ 
    String htmlRaw = String.Format("<div>{0}</div>", text); 
    var xDoc = XDocument.Parse(htmlRaw); // For formatting 
    return new MvcHtmlString(xDoc.ToString()); 
{ 

..和我用它在該視圖片段:

<span> 
    @Html.WrapInDiv("sasuage") 
</span> 

結果如下:

<span> 
    <div> 
    Sausage 
</div> 
</span> 

因爲XDocument作家顯然做不知道我們已經在一個有四個字符縮進的部分。任何方式我可以解決這個問題,以便我的HTML助手打印完美縮進多行HTML?

回答

1

爲什麼要保持縮進正確?瀏覽器並不關心,而且這是一項非常艱鉅的工作,也是一個非常難以解決的問題,尤其是當你在做助手並且沒有整個上下文時。

如果確實需要可視化格式化的輸出,最好的方法是對每個使用攔截答案的HTTP模塊生成的每個頁面執行全局操作,也可以使用.Net端口Html Tidy之一。

public class HtmlTidyModule: IHttpModule 
{ 
    private EventHandler ReleaseRequestStateEvent = null; 

    public void Dispose() 
    { 
     if (ReleaseRequestStateEvent != null) 
      context.ReleaseRequestState -= ReleaseRequestStateEvent; 
    } 

    public void Init(HttpApplication context) 
    { 
     ReleaseRequestStateEvent = new EventHandler(event_ReleaseRequestState); 
     context.ReleaseRequestState += ReleaseRequestStateEvent; 
    } 

    void event_ReleaseRequestState(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 
     // You need to implement HtmlTidyFilter to handle the response 
     app.Response.Filter = new HtmlTidyFilter(app.Response.Filter) 
    } 
} 

但是你必須問自己,你真的想這麼做?瀏覽器中大多數集成的HTML查看器/檢查器已經這樣做了(我相信在chrome/FF中的F12)。

+0

我喜歡你的解決方案,我也很感謝你質疑我的動機。我想整理它,因爲當我正在調試時更容易閱讀生成的源代碼(在IE中查看源代碼,Ctrl + U)。但是,正如你所說的那樣,調試工具已經內置了源代碼導航和整理功能,所以也許我應該專注於更好地使用這些工具。 – Nilzor