2012-01-30 107 views
6

我试图将一些JSON数据发送到我的ASP.NET MVC3控制器操作方法,但无论我做什么,它都不会起作用。ASP.NET MVC将JSON数据发送给控制器操作

这里是我的ajax调用(它使用从json2.js的JSON.stringify方法):

$.ajax({ 
     url: '/Home/GetData', 
     type: "POST", 
     dataType: "json", 
     contentType: "application/json; charset=utf-8;", 
     data: JSON.stringify(filters_data), 
     success: function (data) { 
      alert(data); 
     } 
    }); 

小提琴手这样表示请求:

POST http://localhost:51492/Home/GetData HTTP/1.1 
Host: localhost:51492 
Connection: keep-alive 
Content-Length: 171 
Origin: http://localhost:51492 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko)  Chrome/16.0.912.75 Safari/535.7 
Content-Type: application/json; charset=UTF-8; 
Accept: application/json, text/javascript, */*; q=0.01 
Referer: http://localhost:51492/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

{"Filters":[{"Field":3,"Operator":0,"Values":["30.01.2012.","30.01.2012."]},{"Field":2,"Operator":0,"Values":["-1"]},{"Field":0,"Operator":0,"Values":["some-string"]}]} 

我的C#代码:

[HttpPost] 
public string GetData(QueryFilters filters) 
{ 
    return "Ho ho ho and a bottle of rum."; 
} 

[Serializable] 
public enum Fields 
{ 
     A, 
     B, 
     C, 
     D 
} 

[Serializable] 
public enum FilterOperator 
{ 
    Is, 
    Between, 
    GreaterOrEqual, 
} 

[Serializable] 
public class QueryFilter 
{ 
    public Fields Field { get; set; } 
    public FilterOperator Operator { get; set; } 
    public List<string> Values { get; set; } 
} 

[Serializable] 
public class QueryFilters 
{ 
    public List<QueryFilter> Filters { get; set; } 
} 

我已将以下行添加到global.asax.cs的Application_Start()方法中:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 

操作方法'GetData'中的断点被命中,但是Filters属性的值为空。有任何想法吗?

另一个说明:我试过传递一个更简单的对象:Person - 属性字符串名称和int年龄,具有相同的结果 - 它看起来好像自动模型绑定不适合我,但我不知道如何检查它。

回答

5

问题是,您的动作参数被称为filters,而您的QueryFilters模型中有一个名为Filters的属性,该属性混淆了默认模型联编程序。

所以只需重命名你的行动的说法:

[HttpPost] 
public ActionResult GetData(QueryFilters model) 
{ 
    return Json("Ho ho ho and a bottle of rum."); 
} 

哦,注意动作应返回ActionResults不是字符串。

而且从Global.asax中删除以下行:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 

ASP.NET MVC 3已经有这个内置。

或者,如果你绝对出于某种原因需要让你的动作参数调用filters那么你也可以修改您要发送到这个JSON请求:

data: JSON.stringify({ 
    filters: { 
     Filters: [ 
      { "Field": 3, "Operator": 0, "Values": ["30.01.2012.", "30.01.2012."] }, 
      { "Field": 2, "Operator": 0, "Values": ["-1"] }, 
      { "Field": 0, "Operator": 0, "Values": ["some-string"] } 
     ] 
    } 
}), 

现在有没有更多的不确定性。

+0

+1斑点。我在我的答案中找不到我引用的东西,所以删除了它... – 2012-01-30 13:07:06

+0

非常感谢!我无法解释我有多么沮丧,尝试了十亿种不同的东西,结果却是一个简单的命名问题。 – skali 2012-01-30 13:30:02

+0

一路上真棒,我一直在寻找这个,但当然,它是在堆栈上! – 2013-08-23 06:58:58

相关问题