2

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

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

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

 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 框架都同意的参数字符串的通用规范,但是为什么带有传统标志设置为 true 的 jQuery.param 返回 [object+Object] 超出了我的范围......这在任何框架中都是绝对没用的。

有什么办法可以修补这个吗?

也许用正则表达式替换[#][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*/
}

您还应该使用 JSON.stringify(mydata) 来为 $.ajax 调用创建数据

这样,默认的模型绑定器将负责其余的工作。

于 2013-07-09T21:28:01.783 回答