什么是MvcHtmlString,何时应该使用它?

29 浏览
0 Comments

什么是MvcHtmlString,何时应该使用它?

MvcHtmlString的文档并不是非常有启发性:

表示一个不应再次编码的HTML编码字符串。

我不清楚这意味着什么。似乎一些HTML帮助器方法返回MvcHtmlString,但我在网上看到的一些自定义帮助器示例只返回常规字符串。

问题:

什么是MvcHtmlString?

何时应选择MvcHtmlString而不是string,反之亦然?为什么?

admin 更改状态以发布 2023年5月21日
0
0 Comments

这是一个晚点的回答,但如果有人正在使用razor,你应该记住razor默认编码一切。但是,通过在HTML助手中使用MvcHtmlString,你可以告诉razor它不需要编码它。

如果你想让razor不编码一个字符串,请使用

@Html.Raw("hi")

解开Raw()的代码,我们可以看到它将字符串封装在HtmlString中。

public IHtmlString Raw(string value) {
    return new HtmlString(value); 
}

“HtmlString仅存在于ASP.NET 4中。MvcHtmlString是一个兼容性补丁,添加到MVC 2中,支持.NET 3.5和.NET 4。现在,MVC 3仅支持.NET 4,它是HtmlString的一个相对较小的子类,大概是为了MVC 2->3的源代码兼容性。”来源

0
0 Comments

ASP.NET 4 引入了一个新的代码嵌入语法 <%: %>。 实质上,<%: foo %> 转换为 <%= HttpUtility.HtmlEncode(foo) %>。 团队正在尝试让开发人员在可能的情况下使用 <%: %>,而不是 <%= %>,以防止 XSS 攻击。

然而,这引入了一个问题,如果代码嵌入语法已经编码了其结果,那么 <%: %> 语法将重新编码它。这个问题通过引入 IHtmlString 接口(.NET 4 中新增)来解决。如果 <%: foo() %> 中的 foo() 返回一个 IHtmlString,则 <%: %> 语法将不会重新编码它。

MVC 2 的 helpers 返回 MvcHtmlString,而在 ASP.NET 4 中实现了 IHtmlString 接口。因此,当开发人员在 ASP.NET 4 中使用 <%: Html.*() %> 时,结果不会被双重编码。

编辑:

这种新语法的一个直接好处是您的视图会更加清晰。例如,您可以写 <%: ViewData["anything"] %> 而不是 <%= Html.Encode(ViewData["anything"]) %>

0