没有编码的ASP.NET MVC Razor呈现


Answers:


374

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

@Html.Raw(myString)

8
这并不完全正确。是的,您可以插入一个原始字符串,但是如果有的话"'<>etc...将被转义。正确的方法是使用MvcHtmlString,它将允许使用“非法”字符。例如,如果您正在编码Json数据...而未对整个模型进行编码
Daniel B. Chapman

4
Daniel,Html.Raw() “返回未HTML编码的标记。”
卢卡斯

1
Html.Raw()对引号进行编码..."myAttr='hello';myInt=10"
Serge

4
它不编码引号。除了显而易见的文档外,它还清晰地注明了这一天(“此方法使用IHtmlString类包装HTML标记,该HTML标记呈现未编码的 HTML。”)我也对此进行了测试,并且引号未进行编码。
詹姆斯·威尔金斯


31

就像已经提到的@ 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>

10

@Html.Raw()谨慎使用,因为这可能会给编码和安全性带来更多麻烦。我了解用例,因为我自己必须这样做,但要小心……只是避免让所有文本通过。例如,仅保留/转换特定的字符序列,并始终对其余字符进行编码:

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

然后,您不必担心尚未创建潜在的安全漏洞,并且所有特殊/外国字符都将在所有浏览器中正确显示。


+1正是我需要的!字符串仍然需要编码,但返回的行必须是html。谢谢!
彼得

@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))用于ASP.NET Core
kenjiuno

5

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

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.