我正在尝试将具有四个属性的id
和object
传递给动作控制器,但遗憾的是它没有通过,我收到以下错误。
参数字典包含方法'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; }
}
答案 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) {
}
});