2016-04-27 118 views
3

這是我的ajax在數組中有數據時被調用。Jquery ajax調用在MVC中傳遞JSON數組(500內部服務器錯誤)

function sendDataToController() { 
    $.ajax({ 
     type: 'POST', 
     url: '/Home/Results', 
     cache: false, 
     traditional: true, 
     contentType: "application/json", 
     data: { FormData : exampleFormData }, 
     success: function (data) { 
      alert("sent data to controller") 
     }, 
     error: function (data) { 
      alert("Error " + data.responseText); 
     } 
    }); 
} 

數組是這樣的:

var exampleFormData = []; 

而且JSON看起來像這樣目前正在與一些更多的數據,而且縮短了顯示的目的。

"[{\"Birthdate\":\"1947-03-21\",\"ROWID\":\"000001\",\"SpecCodes\":\"987654\"}]" 

在使用ajax發送到控制器之前,這個JSON被推入數組中多次。

exampleFormData.push(jsonData); 

的控制,這是被傳遞到這個樣子的:

public ActionResult Results(string exampleFormData) 
    { 
     var formDataList = JsonConvert.DeserializeObject<List<SampleFormData>>(exampleFormData); 

     return View(); 

    } 

這裏就是模型「SampleFormData」列表

public class SampleFormData 
{ 
    public string Birthdate { get; set; } 
    public string ROWID { get; set; } 
    public string Score { get; set; } 
    public string SpecCodes { get; set; } 

} 

由於是,這將產生類500內部服務器錯誤。任何人都可以提供任何關於在這裏做錯了什麼的輸入?

編輯:解決方案是從ajax中完全刪除contentType行,並由Rion在響應中提供。

回答

5

有幾件事情需要考慮您提供的代碼,可能會導致您的問題。

確保您可以發佈正確

爲了使您的控制器實際上承認了jQuery通話,你需要確保控制器動作裝飾與[HttpPost]屬性,表示它不應該被用於POST電話:

[HttpPost] 
public ActionResult ExamineeResults(string exampleFormData) 
{ 
    // Your code here 
} 

確保你的目標採取適當的行動

您的AJAX調用目前針對的是Home/Results,但是您的實際控制器操作的名稱是ExamineeResults。此外

url: '/Home/ExamineeResults', 

,如果您有這方面您的視圖中,可以使用Url.Action()方法來解決:除非你已經制定了一些具體的路由規則,你應該使用現有名稱,以確保正確的目標是正確位置:

url: '@Url.Action("ExamineeResults","Home")' 

用適當的參數

MVC將只懂得,你指定它正確的地圖數據。目前,你可以發佈您的內容,例如:

data: { FormData : exampleFormData }, 

這意味着,在你的控制器動作的參數的名稱應與準確(即FormData代替exampleFormData):

public ActionResult ExamineeResults(string FormData) 

了這些關於組建

您應該能夠通過更新你的代碼來解決這個如下:

$.ajax({ 
      type: 'POST', 
      // Use Url.Action() to resolve the proper URL 
      url: '@Url.Action("ExamineeResults","Home")', 
      cache: false, 
      // Use JSON.parse() to serialize your content to send accross 
      data: { formData: JSON.parse(exampleFormData) }, 
      success: function (data) { 
       alert("sent data to controller") 
      }, 
      error: function (data) { 
       alert("Error " + data.responseText); 
      } 
     }); 

與以下控制器一起操作:

[HttpPost] 
// You can let MVC perform the binding for your by mapping your content 
// to an array of your SampleFormData objects 
public ActionResult ExamineeResults(SampleFormData[] formData) 
{ 
     // Do your thing here (as formData is already serialized) 
     return View(); 
} 

您可以see an example of this here及以下證明:

enter image description here

+0

大多數情況下,如果您使用ajax,我使用JsonResult作爲返回類型,並且根本不調用視圖,只返回Json(myObj)。 – nurdyguy

+0

這是一個很好的方法。我只是使用了OP最初發布的相同代碼(使用更通用的ActionResult),但是「JsonResult」可以正常工作。這完全取決於OP想要在行動中實際執行的內容。 –

+0

我的ajax是在一個JavaScript文件,所以我必須使用「主頁/結果」,但這並沒有解決我的問題。我仍然收到內部500服務器錯誤。堆棧跟蹤顯示「無效的JSON圖元:FormData」。如果這有助於找出我的問題。 – user3654442

0

一個與此調用的問題可能是事實,你返回Viewajax通話。據我所知,這是不可能的。如果您必須發佈到此ActionResult您必須發表帖子。另外,請確保您的路由是正確的。按原樣運行此代碼將無法到達所需的端點,因爲您的ActionResult被命名爲「ExamineeResults」,並且您的網址爲「/ Home/Results」。希望這有助於。

+0

錯誤我的結局。我試圖讓這個代碼對其他人有用,並編輯了一些東西。就路由而言,我仍然在創建mvc應用程序時使用默認路由集。 url:「{controller}/{action}/{id}」, – user3654442

相關問題