不能将参数作为JSON传递给mvc控制器

时间:2014-02-05 09:55:58

标签: c# asp.net-mvc

我正在尝试将具有四个属性的idobject传递给动作控制器,但遗憾的是它没有通过,我收到以下错误。

  

参数字典包含方法'System.Web.Mvc.JsonResult GetItems(Int32,Ebiquity.Reputation.Neptune.Web.Models.MyWorkFilterModel)的非可空类型'System.Int32'的参数'batchID'的空条目''在'Ebiquity.Reputation.Neptune.Web.Controllers.MyWorkController'。可选参数必须是引用类型,可空类型,或者声明为可选参数。

     

参数名称:参数

传递的JSON是:

{
    "batchID": 21610,
    "filter":
    {
        "issueNo": "1",
        "messageNo": "2",
        "itemDate": "Wed, 05 Feb 2014 00:00:00 GMT",
        "mediaName":"3"
    }
};

ajax电话:

self.GetItems = function (batchID, issueNo, messageNo, itemDate, mediaName) {

    var filter = {
        issueNo: issueNo,
        messageNo: messageNo,
        itemDate: itemDate,
        mediaName: mediaName
    };

    $.ajax({
        type: "GET",
        url: "/MyWork/GetItems",
        data: JSON.stringify({
            batchID: batchID,
            filter: filter
        }),
        dataType: "json",
        success: function (result) {

            self.Items([]);
            if (result.Items != null) {
                var tempItems = ko.mapping.fromJS(result.Items, mappingOptions);
                self.Items.push.apply(self.Items, tempItems());
            }
        }
    });
};

控制器:

[HttpGet]
public JsonResult GetItems(int batchID, MyWorkFilterModel filter)
{
    using (var rep = new WorkRepository(CurrentUser))
    {
        return Json(rep.GetBatch(batchID, filter), JsonRequestBehavior.AllowGet);
    }
}

过滤器型号:

public class MyWorkFilterModel
{
    public int? IssueNo { get; set; }
    public int? MessageNo { get; set; }
    public string MediaName { get; set; }
    public DateTime? ItemDate { get; set; }
}

6 个答案:

答案 0 :(得分:2)

您必须将AJAX调用的类型更改为POST而不是GET。数据参数不会与GET请求一起发送。

答案 1 :(得分:2)

看起来您的batchID为空。可以在javascript中将其设置为0,也可以将其设为nullable

[HttpGet]
public JsonResult GetItems(int? batchID, MyWorkFilterModel filter)
{

}

答案 2 :(得分:0)

我们在这里有很多讨论(见下面的链接)

Posting JSON data via jQuery to ASP .NET MVC 4 controller action

尝试下面的Ajax DataType:

self.GetItems = function (batchID, issueNo, messageNo, itemDate, mediaName) {

    var filter = {
        issueNo: issueNo,
        messageNo: messageNo,
        itemDate: itemDate,
        mediaName: mediaName
    };

    $.ajax({
        type: "POST",
        url: "/MyWork/GetItems",
        dataType: 'text',
        data: "param=" + JSON.stringify({
            batchID: batchID,
            filter: filter
        }),
        success: function (result) {
            self.Items([]);
            if (result.Items != null) {
                var tempItems = ko.mapping.fromJS(result.Items, mappingOptions);
                self.Items.push.apply(self.Items, tempItems());
            }
        }
    });
};

控制器

[HttpPost]
public JsonResult GetItems(String Param)
{

}

答案 3 :(得分:0)

您可以尝试将IssueNo和MessageNo设为整数而不是字符串。并使用POST代替GET

如果您必须使用GET,您可以将参数作为网址的一部分传递!

答案 4 :(得分:0)

如Semao所述,如果你想要那种JSON,你需要使用POST。由于您以这种方式发布JSON,我猜您只是打字错误并打算使用POST。

如果您真的想要GET,则需要传递URL中的值。

在您的情况下,您需要添加:

[FromUri]
在对象之前

示例:

public class QueryObj
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public Result Get([FromUri] QueryObj queryObj)
{...}

http://.../query?Id=1&Name=test

答案 5 :(得分:0)

我错过了ajax调用的contenttype属性,而不是GET,我使用了POST并且它有效。

$.ajax({
            type: "POST",
            url: "/MyWork/GetItems",
            data: JSON.stringify({
                batchID: batchID,
                filter: filter
            }),
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: function (result) {
                }
        });