2014-02-05 127 views
1

我想通過一個id和一個object,它有四個屬性到動作控制器,但不幸的是它沒有通過,我得到以下錯誤。無法將參數作爲JSON傳遞給mvc控制器

參數字典包含參數提供一個空條目非空類型的「batchID」「System.Int32」的方法「System.Web.Mvc.JsonResult GetItems(的Int32,Ebiquity.Reputation.Neptune.Web。 Models.MyWorkFilterModel)'在'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

我錯過了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) { 
       } 
     }); 
2

你必須改變你的AJAX調用的類型爲POST,而不是GET。數據參數不會與GET請求一起發送。

0

我們有很多的討論,在這裏像這樣的(見下面的鏈接)

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

嘗試像下面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) 
{ 

} 
0

您可以嘗試將IssueNo和MessageNo設置爲整數而不是嚴格GS。並使用POST而不是GET

如果您必須使用GET,您可以將參數作爲URL的一部分傳遞!

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 
2

看起來像你的batchID爲空。將它設置爲0在JavaScript或使其nullable在行動

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

} 
+0

batchID是強制性的,它不爲空,它不會被傳遞到控制器如果失敗空校驗。 – Xerxes

相關問題