ASP.NET MVC Razor渲染时不进行编码

262
默认情况下,Razor会对字符串进行编码。是否有无需编码的特殊语法用于渲染?
6个回答

396

自 ASP.NET MVC 3 起,您可以使用:

@Html.Raw(myString)

9
这不完全正确。是的,你可以插入一个原始字符串,但如果你有 "'<> 等字符,它们将被转义。正确的方法是使用 MvcHtmlString,它将允许 "非法" 字符。例如,如果你要编码 Json 数据... 而不是对整个模型进行编码。 - Daniel B. Chapman
5
Daniel,Html.Raw()“返回未进行HTML编码的标记。” - Lucas
1
Html.Raw() 对引号进行编码... "myAttr='hello';myInt=10" - serge
5
它不对引号进行编码。除了明显的文档中清楚写明(“该方法使用IHtmlString类包装HTML标记,该类会呈现未编码的HTML。”)外,我还进行了测试,引号没有被编码。 - James Wilkins

63
@(new HtmlString(myString))

36

除了已经提到的使用@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>

11

谨慎使用@Html.Raw(),因为它可能会导致编码和安全方面的更多问题。我理解使用场景,因为我自己也不得不这样做,但需要小心处理...只保留/转换特定字符序列并始终对其余部分进行编码,例如:

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

那么你就可以放心,因为你没有制造潜在的安全漏洞,并且任何特殊/外文字符在所有浏览器中都能正确显示。


+1 正是我所需要的!字符串仍需要进行编码,但换行需要转换为 HTML。谢谢! - Peter
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>")) 用于 ASP.NET Core - kenjiuno

6

在ActionLink的情况下,通常会对链接文本使用HttpUtility.Encode进行编码。 在这种情况下, 您可以使用 HttpUtility.HtmlDecode(myString) 当我使用HtmlActionLink解码想要传递的字符串时,它对我起了作用。例如:

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


1

你还可以使用WriteLiteral方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接