ASP.NET MVC Razor 无编码渲染

Posted

技术标签:

【中文标题】ASP.NET MVC Razor 无编码渲染【英文标题】:ASP.NET MVC Razor render without encoding 【发布时间】:2011-05-03 13:32:58 【问题描述】:

Razor 默认对字符串进行编码。不编码渲染有什么特殊语法吗?

【问题讨论】:

【参考方案1】:
@(new htmlString(myString))

【讨论】:

【参考方案2】:

从 ASP.NET MVC 3 开始,您可以使用:

@Html.Raw(myString)

【讨论】:

这并不完全正确。是的,您可以插入原始字符串,但如果您有 "'<>etc...,这些将被转义。正确的方法是使用允许“非法”字符的 MvcHtmlString。例如,如果您正在编码 Json 数据......而不编码整个模型 Daniel, Html.Raw() "返回非 HTML 编码的标记。" Html.Raw() 对引号进行编码..."myAttr='hello';myInt=10" 它不对引号进行编码。除了明显的文档将其简单说明为 day(“此方法使用 IHtmlString 类包装 HTML 标记,它呈现 未编码 HTML。”)我还对此进行了测试,引号不是编码。【参考方案3】:

除了已经提到的@Html.Raw(string) 方法,如果你输出一个 MvcHtmlString 它不会被编码。这在将您自己的扩展添加到 HtmlHelper 或从您知道可能包含 html 的视图模型返回值时很有用。

例如,如果您的视图模型是:

public class SampleViewModel

  public string SampleString  get; set; 
  public MvcHtmlString SampleHtmlString  get; set; 

对于 Core 1.0+(和 MVC 5+)使用 HtmlString

public class SampleViewModel

  public string SampleString  get; set; 
  public HtmlString SampleHtmlString  get; set; 

然后

<!-- this will be encoded -->
<div>@Model.SampleString</div>
<!-- this will not be encoded -->
<div>@Html.Raw(Model.SampleString)</div>
<!-- this will not be encoded either -->
<div>@Model.SampleHtmlString</div>

【讨论】:

【参考方案4】:

请谨慎使用@Html.Raw(),因为您可能会在编码和安全方面造成更多问题。我理解用例,因为我必须自己这样做,但要小心......只是避免允许所有文本通过。例如只保留/转换特定的字符序列并始终编码其余的:

@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))

那么您就可以放心了,您没有造成潜在的安全漏洞,并且任何特殊/外来字符都可以在所有浏览器中正确显示。

【讨论】:

+1 正是我需要的!字符串仍然需要编码,但返回的行必须是 html。谢谢! @Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "&lt;br/&gt;")) 用于 ASP.NET Core【参考方案5】:

你也可以使用 WriteLiteral 方法

【讨论】:

【参考方案6】:

HTML 原始文件:

@Html.Raw(yourString)

【讨论】:

【参考方案7】:

对于ActionLink,它一般在链接文本上使用HttpUtility.Encode。 在这种情况下 您可以使用 HttpUtility.HtmlDecode(myString) 当使用 HtmlActionLink 解码我想要传递的字符串时,它对我有用。例如:

  @Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)

【讨论】:

【参考方案8】:

您只需将 ® 复制粘贴到您的字符串中。 例如:

 @Html.ActionLink("Something ®", "Index", "Home", new  area = "" , new  @class = "navbar-brand" )

Tadaaaa。

【讨论】:

以上是关于ASP.NET MVC Razor 无编码渲染的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Core 中将 Razor 视图渲染为字符串

ASP.NET MVC Razor

ASP.NET MVC4 Razor

Razor 页面简化了 ASP.NET MVC 应用程序

ASP.NET Core:为所有模型生成 Razor 页面

ASP.NEt MVC 使用 Web API 返回 Razor 视图