2013-08-20 71 views
1

我通過jQuery AJAX調用將Json傳回給需要Folder的MVC函數。 MVC正確解析了一些數據,但不是我發回的列表。Json沒有正確解析MVC4中的jQuery AJAX調用

MVC

public class Folder : IValidate 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<SearchCriteria> SearchCriteria { get; set; } 
} 

public class SearchCriteria 
{ 
    public int FolderId { get; set; } 
    public int SettingsEntryID { get; set; } 
    public string SearchParameter { get; set; } 
} 

public ActionResult EditFolder(Folder folder) 
{ 
    service.EditFolder(folder); 
    return this.Json(Json(new { Success = true })); 
} 

的Javascript

var folder = { 
    Id: $("#groupID").val(), 
    Name: $("#groupName").val(), 
    SearchCriteria: [] 
}; 

$(".searchCriteria").each(function() { 
    folder.SearchCriteria.push(
     { 
      FolderId: $("#groupID").val(), 
      SearchParameter: $(this).val(), 
      SettingsEntryID: $(this).attr("id").replace("searchCriteria", "") 
     }); 
}); 

$.ajax({ 
    url: "/settings/editfolder/", 
    type: "POST", 
    dataType: "json", 
    data: folder, 
    traditional: true, 
    success: function (data) { 
     alert("wsaved"); 
    } 
}); 

folder,在此功能被設定IdNameSearchCriteria設置不正確。它設置爲null。如果我註釋掉traditional: true,則會創建列表,但每個SearchCriteria的所有值都是0null

我錯過了什麼嗎?

+0

您是*不*發送JSON。您將對象作爲'data:'選項傳遞,jQuery將把對象轉換爲查詢字符串,如'Id = foo&Name = bar&...'。如果您真的想發送JSON,則必須將該對象轉換爲JSON,如'data:JSON.stringify(JSON)'。不管這是不是問題,我不能說(我不知道MVC)。 –

+1

你缺少兩點1.'contentType:'application/json; charset = utf-8','2。'data:JSON.stringify(folder),'**和一個更正。** URL應該像'url:「@ Url.Action(」ActionName「,」ControllerName「,新的{area =「AreaName」})「' –

+0

當你發送你的文章時,Ajax實際上會發送類似'SearchCriteria = Array'的東西而不是實際的數組。以前我沒有列出綁定列表,但您可以查看以下內容:http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx –

回答

2

你缺少兩點

1. contentType: 'application/json; charset=utf-8', 

2. data: JSON.stringify(folder) 

和一個修正

URL應該像

url : "@Url.Action("ActionName", "ControllerName", new { area = "AreaName" })" 

jQuery的

$.ajax({ 
    url: "@Url.Action("Action", "Controller", new { area = "Area" })", 
    type: "POST", 
    contentType: 'application/json; charset=utf-8', 
    dataType: "json", 
    data: JSON.stringify(folder), 
    traditional: true, 
    success: function (data) { 
     alert("wsaved"); 
    } 
});