C# 无法将参数作为JSON传递给mvc控制器

C# 无法将参数作为JSON传递给mvc控制器,c#,asp.net-mvc,C#,Asp.net Mvc,我试图将具有四个属性的id和对象传递给动作控制器,但不幸的是,它没有通过,我得到以下错误 参数字典包含方法“System.Web.Mvc.JsonResult GetItems(Int32,Ebiquity.Reputation.Neptune.Web.Models.MyWorkFilterModel)”在“Ebiquity.Reputation.Neptune.Web.Controllers.MyWorkController”中的非空类型“System.Int32”参数“batchID”的空条

我试图将具有四个属性的
id
对象
传递给动作控制器,但不幸的是,它没有通过,我得到以下错误

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

参数名称:参数

正在传递的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; }
}

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

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

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

尝试以下Ajax数据类型:

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)
{

}

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

尝试以下Ajax数据类型:

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)
{

}

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


如果必须使用GET,则可以仅作为url的一部分传递参数

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


如果必须使用GET,则可以仅作为url的一部分传递参数

正如Semao所提到的,如果你想要那种JSON,你需要使用POST。既然你以这种方式发布JSON,我想你只是有一个打字错误,打算使用POST

如果您真的想要获取,您需要在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

正如Semao所提到的,如果您想要这种JSON,您需要使用POST。既然你以这种方式发布JSON,我想你只是有一个打字错误,打算使用POST

如果您真的想要获取,您需要在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

我缺少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) {
                }
        });

我缺少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) {
                }
        });

看起来您的
batchID
为空。在javascript中将其设置为
0
,或者在操作中将其设置为
null

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

}

看起来您的
batchID
为空。在javascript中将其设置为
0
,或者在操作中将其设置为
null

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

}

batchID是强制性的,它不为null,如果它未通过null检查,它将不会传递给控制器。batchID是强制性的,它不为null,如果它未通过null检查,它将不会传递给控制器。