ASP.NET MVC将JSON数据发送到Controller Action

ska*_*ali 6 javascript c# json asp.net-mvc-3

我正在尝试将一些JSON数据发送到我的ASP.NET MVC3控制器操作方法,但无论我做什么它都无法工作.

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

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

Fiddler显示这样的请求:

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"]}]}
Run Code Online (Sandbox Code Playgroud)

我的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; }
}
Run Code Online (Sandbox Code Playgroud)

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

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
Run Code Online (Sandbox Code Playgroud)

命中操作方法"GetData"中的断点,但Filters属性的值为null.有任何想法吗?

另一个注意事项:我尝试传递一个更简单的对象:Person - 属性字符串Name和int Age,结果相同 - 看起来好像自动模型绑定对我不起作用但我不知道如何检查它.

Dar*_*rov 5

问题是你的action参数被调用filters,并且在你的QueryFilters模型中你有一个叫做Filters混淆默认模型绑定器的属性.

所以只需重命名你的动作参数:

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

哦,请注意,操作应该返回ActionResults而不是字符串.

同时从global.asax中删除以下行:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
Run Code Online (Sandbox Code Playgroud)

ASP.NET MVC 3已经内置了这个.

或者,如果您出于某种原因绝对需要调用您的action参数,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"] }
        ]
    }
}),
Run Code Online (Sandbox Code Playgroud)

现在不再有歧义了.