【问题标题】:ASP.NET MVC sending JSON data to a Controller ActionASP.NET MVC 将 JSON 数据发送到控制器操作
【发布时间】:2012-02-22 06:25:40
【问题描述】:

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

这是我的 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);
        }
    });

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"]}]}

我的 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 属性的值为 null。有什么想法吗?

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

【问题讨论】:

    标签: c# javascript json asp.net-mvc-3


    【解决方案1】:

    问题在于您的操作参数称为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"] }
            ]
        }
    }),
    

    现在不再有歧义了。

    【讨论】:

    • +1 很好看。我找不到我在回答中引用的内容,所以将其删除...
    • 非常感谢!我无法解释我有多沮丧,尝试了十亿种不同的东西,结果只是一个简单的命名问题。
    • 一路都很棒,我一直在寻找这个,但当然,它在堆栈上!
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2019-03-30
    • 2018-11-26
    • 1970-01-01
    • 2020-06-28
    相关资源
    最近更新 更多