2011-12-17 23 views
2

System.Net.WebClientとASP.net MVC 3のWebサイトでいくつか基本的なテストを行いました。アクションのパラメータにバインドすると、MVCはUrlEncodedされたクエリ文字列パラメータを自動的にデコードしますGETを使用する場合。しかし、POSTパラメータを自動的にデコードすることはありません。これには理由がありますか?不必要な不便のようです。ASP.net MVCがPOST(別名フォーム)パラメータを自動的にデコードしないのはなぜですか?

+3

チェックアウトのモデルバインディングです。 –

答えて

11

ASP.NET MVCのデフォルトモデルバインダーは、Request.Formプロバイダーを使用してPOST値を読み取ります。このプロバイダは、URLエンコードされたパラメータも自動的にデコードします。

次のPOSTペイロード送信する場合、たとえば:だから、あなたはおそらく要求をコード正しくURLではありません

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

:対応するコントローラのアクションに

foo=%26&bar=%3D 

を、あなたは正しい値を取得します。

+0

ありがとうダーリン。あなたが正しい。 WebClient.UploadValuesがあなたのためにパラメータをエンコードしていることを認識していなかったので、私はテスト用のパラメータ "didn ' t"を二重にエンコードしていました。 UploadValuesを呼び出す前にURLエンコードを行わなかった場合(つまり、パラメータが1回のみエンコードされた場合)、テスト値のために「潜在的に危険なリクエスト」エラーが発生します。 私は、URLエンコーディングがこのようなエラーを処理すると思っていたので、実際にテスト/理解にレンチを投げました。再度、感謝します。 – Sean

+0

+1これが見つかりました。それが自動的にデコードされているかどうかを知る必要がありました。ありがとう! – ryanulit

+0

webapiは、投稿が発生したときに自動解読も行いますか? –

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) { 
      }; 

あなた自身もエンコードすると、2重にエンコードされたデータが得られます。 Asp.netコントローラのパラメータは、getまたはpostの場合には常に1回デコードされます。

関連する問題