在GET请求中绑定复杂对象的数组 - jquery.param()传统标志

时间:2013-07-09 19:56:42

标签: javascript jquery regex asp.net-mvc-4 model-binding

我正在尝试对以下控制器操作进行jquery.ajax调用:

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

我有以下数据JSON对象,相应的服务器端模型有public {get;组; } properties:

 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返回一个[object + Object]超出了我...这在任何框架中都是无用的。

有什么方法可以补丁吗?

也许是用[{1}}替换模式[#][text]的正则表达式? (实际上这个编码版本更相关)

1 个答案:

答案 0 :(得分: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*/
}

你也应该使用JSON.stringify(mydata)为$ .ajax调用创建数据

这样,默认的模型绑定器会处理其余部分。