HTML使用RazorEngine呈现为文字字符串.我怎么能阻止这个?

Dav*_*Dev 5 c# razor

我正在尝试使用RazorEngine(http://razorengine.codeplex.com/)生成HTML文档.一切主要工作,但我现在的问题是,一些被正确呈现的HTML,和HTML,我已经嵌套在所呈现的文字HTML,因此而不是显示表和div的浏览器如预期的,这是显示例如

 "<table></table><div></div>"
Run Code Online (Sandbox Code Playgroud)

我通过调用以下内容启动此过程:

string completeHTML = RazorEngine.Razor.Parse("InstallationTemplate.cshtml", new { Data = viewModels });
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

其中InstallationReportDigiChannels定义如下:

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);
}
Run Code Online (Sandbox Code Playgroud)

GetDigiChannelsHtml()运行并返回renderedHtml,执行的线返回TemplateBase.cs到方法ITemplate.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();
    }
Run Code Online (Sandbox Code Playgroud)

当我检查时builder.ToString(),我可以看到它包含适当的HTML InstallationTemplate.cshtml内容,并转发HTML的DigiChannels.cshtml东西.例如:

在此输入图像描述

如何才能@installationReport.DigiChannels()包含正确的HTML而不是当前正在执行的转义HTML?

Lee*_*ley 20

你有没有尝试过:

@Raw(installationReport.DigiChannels())
Run Code Online (Sandbox Code Playgroud)

编辑:我可以按照以下方式使用它(MVC3)

@Html.Raw(installationReport.DigiChannels())
Run Code Online (Sandbox Code Playgroud)


Dam*_*ver 5

替代方法@Raw是将API更改为HtmlString在适当的位置返回s

表示不应再次编码的HTML编码字符串.

默认的剃刀行为是对strings 进行编码.