当前位置: 首页 > 知识库问答 >
问题:

是否需要在 MVC 剃刀中对属性值进行编码?

雷曜灿
2023-03-14

在cshtml文件中,我将字符串分配给属性。例如:

<input name="somename" value="@Model.Value">

自从@模特。值字符串可以包含任何Unicode字符,显然该字符串必须经过编码。Razor会自动编码这个值吗?我猜它不会或不能,因为我可以很容易地把一个@Html。Raw在它之后立即把整个事情分解成两个标记。

我想我需要做的是:

<input name="somename" value="@Html.Raw(Html.AttributeEncode(Model.Value))">

对吗?

同样,如果我在脚本的JavaScript字符串中嵌入字符串值,我应该使用:

//I could use Ajax instead of HttpUtility here, but Ajax just wraps the same call.
<script>$('id').data('key','@Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value))');</script>

共有2个答案

红智鑫
2023-03-14

Razor会自动对其进行编码,因此您无需这样做。

具体来说,它是使用HttpUtility Encode / Decode方法编码的,这种情况会发生在任何不是IHtmlString的对象上,比如MvcHtmlString。

再次对其进行编码是多余的。如果您需要逃避这种行为,您需要使用Html.Raw助手,如果用户输入您正在渲染的模型值,这可能是一个安全风险。

伯鸿达
2023-03-14

默认情况下,Razor对字符串执行HTML编码。根据字符串被注入HTML流的位置,这可能是要使用的正确编码,也可能不是。如果不是正确的编码,那么您需要自己执行正确的编码并确保返回MvcHtmlString(即IHtml字符串),以确保Razor不使用自定义编码。

由于Razor使用超文本标记语言编码,这在技术上不同于超文本标记语言属性编码(它是一个子集),因此使用@Html.Raw(Html.AttributeEncode(Model.Value))对超文本标记语言属性值进行编码并没有错。同时,这也没有必要,因为默认的超文本标记语言编码使用相同的基本格式,最终只会编码几个字符,否则这些字符不需要用超文本标记语言属性值编码。

另一方面,在最后一种情况下,一个字符串被注入到JavaScript字符串的引号中,HTML编码肯定是不正确的,所以您肯定需要像我一样自己执行编码:@Html。Raw(属性。JavaScriptStringEncode(模型。值))。

 类似资料:
  • 问题内容: [ 我正在编写自动生成HTML的代码,并且希望它对事物进行正确编码。 假设我正在生成指向以下URL的链接: 我假设所有属性值都应进行HTML编码。(如果我写错了,请纠正我。)因此,这意味着如果将上述URL放入锚标记中,则应将&编码为,如下所示: 那是对的吗? ]() 问题答案: [ 是的。HTML实体在HTML属性中进行了解析,并且流浪会造成歧义。这就是为什么您应该始终编写而不是仅在

  • 我正在使用ASP.NET core MVC为我的应用程序创建动态图表。我正在使用CanvasJS绘制图表。 我想根据屏幕上选择的参数绘制图表数据。因此,我有一个dropdownlist和一个datatable来定义从数据库检索哪些数据。 问题是在我单击按钮后没有加载我的图表。然而,当我调试应用程序时,根据控制台日志,js函数正在工作,但它不更新图表中的。 我的看法是 我的控制器就像 例如,当我从屏

  • 问题内容: 我正在考虑让最终用户能够将“部分视图”(控件)放入存储在数据库中的信息中。有没有一种方法可以执行我从数据库获取的作为Razor视图的一部分的字符串? 问题答案: 更新(我全都忘了) 我之前曾问过这个问题(这使我创建了RazorEngine)是从数据库而不是从文件中提取视图 我至少知道两个:RazorEngine,MvcMailer 我对RazorEngine有偏见,因为我一直在努力,但

  • 问题内容: 下面的对象有一个嵌套对象 我应该如何在减速器中处理它? 我可以如上所述做吗?我只是将整个对象分配给它而不进行复制? 要么 还是应该对对象进行深层复制并将其分配给?谢谢 问题答案: 处理嵌套数据更新的“正确”方法是使用多个浅表副本,每个浅层副本一个。按照您的第一个示例,完全可以完全替换一个字段的新对象当然也可以。 有关如何正确执行不可变更新的一些信息,请参阅不可变更新模式的Redux文档

  • 我正在处理一个Spring 3项目,并且总是检查@ModelAt0016是否为空,如果是,我将用户重定向到错误页面。 我想知道的是这张支票是否必要。该命令是会话属性,必要时使用控制器的“填充”方法创建。因此,只要会话处于活动状态,该命令就永远不能为null。 我不知道会话过期时会发生什么。控制器是否再次创建模型属性?如果是这样,那么无论会话的状态如何,命令对象永远不能为null。 谢谢你的帮助。

  • 问题内容: 是否需要进行显式的if(log.isDebugEnabled()){…}检查? 我的意思是,我已经看到一些帖子提到log.debug(“something”)进行隐式调用,以查看调试模式日志记录是否已启用,然后再进行日志记录。我是否缺少某些东西,或者在使用此步骤之前有中间步骤要执行? 谢谢! 与 编辑:在上面写过:http : //java.sg/whether-to-do-a-isd