使用 Microsoft.AspNetCore.Html.HtmlString

Sré*_*áîr 5 c# asp.net-mvc razor asp.net-core-mvc asp.net-core-2.0

它是在Visual Studio 2017上运行的.Net Core 2.0应用程序, 我想在视图上显示返回的 HTML 字符串。

我已将Microsoft.AspNetCore.Html.Abstractions Nuget添加到我的应用程序中,并且我想在 Razor 视图上显示一个 HTML 标记,这就是我的 CSHTML 的样子

@model EDMTLC.Models.QuickResultViewModel
@using Microsoft.AspNetCore.Html;
<div>@Html.Display(Model.ResultHTML) </div>
<div>TEST</div>
Run Code Online (Sandbox Code Playgroud)

我不认为@Html.Display 是我应该做的。在以前的版本 .Net 中我曾经

<div>
    <text> @MvcHtmlString.Create(Model.ReportHTML)</text>
 </div>
Run Code Online (Sandbox Code Playgroud)

但这将不再适用于 Core 2.0

有人可以帮忙举个例子吗?我找到了这个线程,但它没有帮助!

谢谢

Don*_*ong 7

一个更优雅的解决方案是构建一个扩展方法:

using Microsoft.AspNetCore.Html;
public static class StringExtensions
{
    /// <summary>
    /// Convert a standard string into a htmlstring for rendering in a view
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static HtmlString ToHtmlString(this string value)
    {
        return new HtmlString(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要,请在您的 _ViewImports 文件中包含命名空间:

@using MyProject.Extensions
Run Code Online (Sandbox Code Playgroud)

现在,在您看来,您将能够执行以下操作:

<div>@Model.ReportHTML.ToHtmlString()</div>
Run Code Online (Sandbox Code Playgroud)

我建议在现实世界的应用程序中进行额外的清理,但这应该可以回答OP的问题。


Dav*_*ang 3

你有没有尝试过@Html.Raw()?它应该将值显示为原始字符串,而不进行编码。

<pre>
    <code>@Html.Raw(Model.ReportHTML)</code>
</pre>
Run Code Online (Sandbox Code Playgroud)

这应该也适用于Asp.Net Core Mvc 2.0以前的版本,而不需要安装额外的 NuGet 包。

笔记

  1. 为了使用@Html.Display(),如果您将字符串表达式传递到参数中,则该参数必须与视图模型中定义的属性之一匹配。

    // This doesn't work
    @Html.Display(Model.ResultHTML)
    
    // This works but it encodes your HTML
    @Html.Display("ResultHtml")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者您可以使用@Html.DisplayFor()并传递lambda表达式来避免视图中的魔术字符串

    // This works but it encodes your HTML
    @Html.DisplayFor(x => x.ResultHTML)
    
    Run Code Online (Sandbox Code Playgroud)