在自定义MVC HTML扩展帮助程序中维护当前缩进

时间:2014-01-17 11:27:06

标签: asp.net-mvc asp.net-mvc-4

假设我有System.Web.Mvc.HtmlHelper<T>的以下自定义扩展程序:

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 个答案:

答案 0 :(得分:1)

为什么要保持缩进正确?浏览器不关心,这是一项很多工作,也是一个非常难以解决的问题,特别是在你做助手而没有整个环境时。

最好的方法,如果你真的,真的需要可视化格式的输出,那就是使用HTTP模块生成的每个页面全局地执行它,该模块拦截答案,并且可能是Html Tidy的.Net端口之一。

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)。