5

コントローラ メソッドが受信したパラメータを投稿データまたは URL から取得する必要があることをどのように認識しているかをよりよく理解したいと思います。

次の例を見てください。

URL: /ModelController/Method/itemID 
// Where itemID is the id (int) of the item in the database
POST: objectOrArray: {JSON Object/Array}

コントローラーは次のようになります。

[HttpPost]
public ActionResult InputResources(int? id, Object objectOrArray)

どういうわけか、このメソッドはid、サイトの URLObjectHTTPPost.

これは機能しますが、その理由はわかりません。その結果、予測不可能で不安定な動作に遭遇することがあります。たとえば、?fromを削除すると、コントローラ メソッドは、URL ではなくint? idで ID を検索する必要があるとすぐに想定するようになることがわかったようです (100% 確実ではありませんが)。HTTPPost

そこで、次の点を明確にしたいと思います。

データを探す場所をメソッドに伝えるのは、正確には何ですか? ([HttpPost]メソッドに先行する属性?)

命名規則は適用されますか? (たとえば、変数名として?使用しないか削除しますか?)id

変数が配置される順序に影響はありますか? Object(つまり、 を の前に置くid)

試行錯誤によってこのようなもののいくつかを多かれ少なかれ把握できることはわかっていますが、観察に基づいた仮定の作業を続けるのではなく、適切な説明が必要です.

ありがとうございました

チョポ

4

1 に答える 1

5

からのデフォルト ルートを見てみましょうGlobal.asax

routes.MapRoute(
    "Default",                                            
    "{controller}/{action}/{id}",                     
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

MVC が最初に試みることは、メソッド パラメータを POST の値にマップすることです。一致が見つからない場合は、ルート値を含む他の可能性をカスケードします。

モデル バインダーが使用する順序は次のとおりです。

  1. アクションが子アクションの場合、以前にバインドされたアクション パラメーター
  2. フォーム フィールド (Request.Form)
  3. JSON リクエスト本文 (Request.InputStream) のプロパティ値。ただし、リクエストが AJAX リクエストの場合のみ
  4. ルート データ (RouteData.Values)
  5. クエリ文字列パラメーター (Request.QueryString)
  6. 投稿されたファイル (Request.Files)

説明した動作が表示される理由は、POST データがルート値の前に来るためです。MVC は nullable int を POST 値にバインドできないようです。そのため、スキップしてマッピングに到達するまで続行しRouteData、その時点で一致を見つけてルートから値を取得します。パラメータをnull不可にすると、突然、POST値にバインドできるようになり、より優先度が高くなりRouteDataます。

ソース: http://msdn.microsoft.com/en-us/magazine/hh781022.aspx

于 2013-04-26T09:41:48.653 に答える