如何使用缩进和换行自动格式化Razor输出?

如何使用缩进和换行自动格式化Razor输出?,razor,formatting,markup,asp.net-mvc-4,Razor,Formatting,Markup,Asp.net Mvc 4,我有一些带有大量条件逻辑、循环、局部视图等的Razor页面。很容易保持输出标记的语义正确,但更难使用正确的缩进和换行符对其进行格式化。如何在运行时自动执行此操作?是否有模块或剃须刀扩展 请不要说右键单击->格式选择。为了清楚起见,我希望在编写Razor页面时不必考虑格式问题。我希望我的Razor标记以一种对开发人员有意义的方式进行布局(例如,在服务器端块中缩进),但对于点击“查看源代码”的古怪用户来说,呈现的HTML要“美化”。(我不担心增加输出的大小,因为我使用的是gzip/deflate。)

我有一些带有大量条件逻辑、循环、局部视图等的Razor页面。很容易保持输出标记的语义正确,但更难使用正确的缩进和换行符对其进行格式化。如何在运行时自动执行此操作?是否有模块或剃须刀扩展


请不要说右键单击->格式选择。为了清楚起见,我希望在编写Razor页面时不必考虑格式问题。我希望我的Razor标记以一种对开发人员有意义的方式进行布局(例如,在服务器端块中缩进),但对于点击“查看源代码”的古怪用户来说,呈现的HTML要“美化”。(我不担心增加输出的大小,因为我使用的是gzip/deflate。)

您可以使用像
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

我从这个来源了解到: