2

次のコントローラー アクションへの jquery.ajax 呼び出しを試みています。

public ActionResult Handler(SemanticPart[] semanticParts, string first, string last)

public { get; を持つ対応するサーバー側モデルを持つ次のデータ JSON オブジェクトがあります。設定; } プロパティ:

 var data = {
      semanticParts: [{ hasLabel: "label", hasType: "type", hasIndex : 0 }],
      first: "first",
      last : "last"                             
 };

問題は、jQuery.paramにデフォルトの MVC モデル バインダーのシリアル化オプションがないように見えることです。

decodeURIComponent($.param(data))生成:

 "semanticParts[0][hasLabel]=label&semanticParts[0][hasType]=type&semanticParts[0][hasIndex]=0&first=first&last=last"

フラグを次のように設定すると、次のtraditionalようになりdecodeURIComponent($.param(data, true))ます。

 "semanticParts=[object+Object]&first=first&last=last"

複雑な配列用の MVC の既定のモデル バインダーには、正しくバインドするために次のものが必要です (Fiddler Composer でテスト済み)。

 "semanticParts[0].hasLabel=label&semanticParts[0].hasType=type&semanticParts[0].hasIndex=0&first=first&last=last"

単に使用したもの:array[0].property=代わりにarray[0][property]=

すべてのWebフレームワークで合意されたparam文字列の普遍的な仕様がないことは理解していますが、従来のフラグがtrueに設定されたjQuery.paramが[オブジェクト+オブジェクト]を返す理由は私を超えています...どのフレームワークでもまったく役に立ちません。

これにパッチを当てる方法はありますか?

おそらく、パターンを置き換える正規表現[#][text][#].text? (実際には、これのエンコードされたバージョンがより関連性があります)

4

1 に答える 1

1

このパラメーターを保持するモデルを実装する必要があります。

public class SemanticPartViewModel 
{
  public List<SemanticPart> semanticParts { get; set;} 
  public string first { get; set; }
  public string last { get; set;}
}

そして、これをパラメーターとして受け取るようにコントローラーを変更します

public ActionResult Handler(SemanticPartViewModel semanticParts)
{
  /*Do stuff*/
}

$.ajax 呼び出しのデータを作成するには、JSON.stringify(mydata) も使用する必要があります。

このようにして、デフォルトのモデルバインダーが残りを処理します。

于 2013-07-09T21:28:01.783 に答える