5

RazorEngine ( http://razorengine.codeplex.com/ ) で HTML ドキュメントを生成しようとしています。すべてがほとんど機能していますが、私が現在抱えている問題は、HTML の一部が正しくレンダリングされていることと、ネストされた HTML がリテラル HTML としてレンダリングされていることです。表示など

 "<table></table><div></div>"

このプロセスを開始するには、次のように呼び出します。

string completeHTML = RazorEngine.Razor.Parse("InstallationTemplate.cshtml", new { Data = viewModels });

その後completeHTML、ファイルに書き込まれます。

「InstallationTemplate.cshtml」は次のように定義されています。

@{
    var installationReport = new InstallationReport(Model.Data);
}

<!DOCTYPE html>
<html>
    <head></head>
    <body>        
        <div>
            <!-- I would expect this to write the rendered HTML
                 in place of "@installationReport.DigiChannels()" -->
            @installationReport.DigiChannels()    
        </div>
    </body>
</html>

InstallationReportとは次DigiChannelsのように定義されます。

public static class InstallationReportExtensions
{
    public static string DigiChannels(this InstallationReport installationReport)
    {
        return installationReport.GetDigiChannelsHtml();
    }
}

public class InstallationReport
{
    public string GetDigiChannelsHtml()
    {
        // the following renders the template correctly
        string renderedHtml = RazorReport.GetHtml("DigiChannels.cshtml", GetDigiChannelData());
        return renderedHtml;
    }
}

public static string GetHtml(string templateName, object data)
{
    var templateString = GetTemplateString(templateName);

    return RazorEngine.Razor.Parse(templateString, data);
}

GetDigiChannelsHtml()runs と returnの後、実行行はmethodにrenderedHtml戻ります。これは次のように定義されています。TemplateBase.csITemplate.Run(ExecuteContext context)

    string ITemplate.Run(ExecuteContext context)
    {
        _context = context;

        var builder = new StringBuilder();
        using (var writer = new StringWriter(builder)) 
        {
            _context.CurrentWriter = writer;

            Execute(); // this is where my stuff gets called

            _context.CurrentWriter = null;
        }

        if (Layout != null)
        {
            // Get the layout template.
            var layout = ResolveLayout(Layout);

            // Push the current body instance onto the stack for later execution.
            var body = new TemplateWriter(tw => tw.Write(builder.ToString()));
            context.PushBody(body);

            return layout.Run(context);
        }

        return builder.ToString();
    }

を調べるbuilder.ToString()と、適切な HTML が含まれておりInstallationTemplate.cshtml、エスケープされた HTML が含まれていることがわかりますDigiChannels.cshtml。例えば:

ここに画像の説明を入力

@installationReport.DigiChannels()現在行っているエスケープされた HTML の代わりに正しい HTML を含めるにはどうすればよいですか?

4

2 に答える 2

5

代替手段は、適切な場所で s@Rawを返すように API を変更することですHtmlString

再度エンコードしてはならない HTML エンコード文字列を表します。

デフォルトのカミソリの動作は、strings をエンコードすることです。

于 2013-07-24T13:36:49.023 に答える