3

条件付きロジック、ループ、部分ビューなどがたくさんあるRazorページがいくつかあります。出力マークアップを意味的に正しく保つのは簡単ですが、正しいインデントと改行でフォーマットするのはより困難です。実行時にこれを自動的に行うにはどうすればよいですか?モジュールまたはRazor拡張機能はありますか?

右クリック->フォーマット選択とは言わないでください。明確にするために、私はRazorページを書くときにフォーマットについて考える必要を避けたいと思います。Razorマークアップを開発者にとって意味のある方法でレイアウトしたいのですが(たとえば、サーバー側のブロック内にインデントします)、レンダリングされたHTMLは、[ソースの表示]をクリックした奇妙な人のために「プリティファイド」されます。(gzip / deflateを使用しているので、出力のサイズを大きくする必要はありません。)

4

1 に答える 1

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

ボイラ!;)

私はこのソースからそれを学びました:http://blog.aquabirdconsulting.com/2009/10/28/asp-net-mvc-clean-html/

于 2012-05-04T19:03:46.220 に答える