Javascript 如何对使用json发送到MVC控制器的数据进行编码?
我的表单上有一个文本字段,可以包含html代码和<>字符的代码。我想将其存储在数据库中,但首先我想对其进行编码,这样就可以安全地接受它,而无需执行[allowHtml} 以下是我用来发送数据的代码。请注意,我一次只发送一个字段,可能包含或不包含html代码的数据位于javascriptval变量中:Javascript 如何对使用json发送到MVC控制器的数据进行编码?,javascript,jquery,asp.net-mvc,asp.net-mvc-3,Javascript,Jquery,Asp.net Mvc,Asp.net Mvc 3,我的表单上有一个文本字段,可以包含html代码和字符的代码。我想将其存储在数据库中,但首先我想对其进行编码,这样就可以安全地接受它,而无需执行[allowHtml} 以下是我用来发送数据的代码。请注意,我一次只发送一个字段,可能包含或不包含html代码的数据位于javascriptval变量中: $.ajax({ cache: false, url: "/Admin/" + obj.table + "s/JsonUpdate", dataTy
$.ajax({
cache: false,
url: "/Admin/" + obj.table + "s/JsonUpdate",
dataType: 'json',
type: 'POST',
data: { pk: pk, rk: rk, fld: type, val: val }
})
在服务器端控制器上,我有以下代码:
[HttpPost]
public JsonResult JsonUpdate(string pk, string rk, string fld, string val) {
Content content = null;
try {
if (fld == "TempRowKey") {
建议我使用viewModel和[allowtml],但如果数据是编码的,为什么我必须使用[allowtml]
下面是我尝试发送
时发生的情况。发送的数据是:
pk=0006000&rk=0100&fld=Notes&val=%3Cx%3E
然后,服务器回复为:
Server Error in '/' Application
A potentially dangerous Request.Form value was detected from the client (val="<x>").
“/”应用程序中的服务器错误
潜在危险的请求。从客户端检测到表单值(val=”“)。
只要您不重写请求的
contentType
或processData
(在您的示例中,您不重写),发送的数据默认为URL编码:
向服务器发送数据时,使用此[设置]内容类型。默认值为
“application/x-www-form-urlencoded;charset=UTF-8”,适用于
大多数情况下
这可以通过使用Firebug或类似工具来检查提交的请求来确认
更新:
看起来您正试图绕过没有[allowtml]
的限制。无论您最初不使用它的原因是什么,您都可以手动提交数据,然后在服务器上还原
关于您的后续问题……但是如果数据是编码的,那么为什么我必须使用[AllowHtml]:
使用jQuery.ajax
提交数据时,其内容类型默认设置为application/x-www-form-urlencoded
。此编码仅在传输过程中适用-认为数据的表示形式是urlencoded,而不是实际数据。这有什么不同?当服务器收到请求时,它会识别内容在进一步处理(和验证)之前键入并解码。基本上,协议级别上较低级别的数据传输处理由您编写的代码之外的框架处理
如果在提交之前在客户端上手动编码数据,服务器应用程序将以这种方式接收数据,而不会检测到任何危险值。请注意,在传输过程中,字符串将显示为有效的双重编码,但这不会影响最终结果。使用带有
[allowtml]的视图模型
,然后在存储到数据库之前进行编码。但是为什么要麻烦呢?按数据库中的原样存储,当需要在网页上输出存储在数据库中的值时,只需对其进行HTML编码。默认情况下,@
Razor操作符就是这样做的。jQuery/Javascript/XHR将自动对通过H发送的值进行编码TTP正确。客户端部分不需要做更多的工作,其余部分是服务器端工作。由于可能会将恶意内容发送到服务器,因此需要在那里对数据库进行转义-向我们显示您的服务器端代码。@Bergi-我更新了我的问题。我确实看到数据已编码(谢谢)但是我想知道为什么控制器会拒绝它。谢谢,但是你能告诉我如何用上面的ajax设置内容类型吗?默认设置是正确的。你可以通过查看Web Inspector/Firefox等中的请求正文来验证这一点。如果提交的数据不是URL编码的,你可能想添加更好的代码示例,最好是在JSFIDL上e、 如果提交的数据是urlencoded的,但没有被服务器解释为urlencoded的,这是一个完全不同的场景。您好,Darin,问题是我不想在视图中对其进行编码。我希望文本显示为。我的问题是,当它到达控制器时,它被停止了。是的,这就是您应该使用视图模型并修改它的原因具有[allowtml]
属性的Val
属性。