2011-12-17 68 views
2

我已经用System.Net.WebClient和一个ASP.net MVC 3网站做了一些基本的测试,我发现绑定到一个动作的参数时,MVC会自动解码任何已经被UrlEncoded查询的字符串参数如果你使用GET。但它不会自动解码POST参数。是否有一个原因?似乎是不必要的不​​便。为什么ASP.net MVC不能自动解码POST(aka Form)参数?

+3

它会检查模型绑定。 – 2011-12-17 05:26:06

回答

11

ASP.NET MVC默认模型联编程序使用Request.Form提供程序来读取POST值。这个提供者也自动解码url编码参数。

例如,如果您发送以下POST有效载荷:在相应的控制器动作

foo=%26&bar=%3D 

你会得到正确的值:

[HttpPost] 
public ActionResult Test(string foo, string bar) 
{ 
    // foo equals & 
    // bar equals = 
} 

所以你可能不正确的URL编码请求。

+0

谢谢Darin。你是对的。 事实证明,我是双重编码我的测试参数,“doesn '吨”,因为我没有意识到WebClient.UploadValues为你编码params。如果我在调用UploadValues之前没有进行URL编码,即参数只编码一次,则由于我的测试值,我得到了一个“潜在危险的请求”错误。 我认为URL编码会处理任何这样的错误,所以真的把一个扳手投入我的测试/理解。再次感谢。 – Sean 2011-12-19 18:15:52

0

如果您使用jQuery.Post并使用data参数作为POST数据发送数据,如下面的代码片段所示,那么jquery会自动为您编码。

var postdata = { 
      url: someUrl, //do not encodeURIComponent, it's done by jquery.post. test with some edge url if in doubt 
      }; 

     $.post(serverUrl, postdata) 
      .done(function (data) { 
      }; 

如果你还编码自己,那么你会得到双重编码的数据。无论是get还是post,Asp.net控制器参数总是被解码一次。