2011-12-17 44 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控制器參數總是被解碼一次。