2013-08-20 2 views
1

Я передаю Json через вызов JQuery AJAX функции MVC, которая принимает Folder. MVC правильно разбирает некоторые данные, но не список, который я отправил назад.Json не правильно разобрался с вызовом jQuery AJAX в MVC4

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, в этой функции получает набор с Id и Name но SearchCriteria не установлен должным образом. Он установлен в null. Если я прокомментирую traditional: true, список будет создан, но все значения для каждого SearchCriteria будут 0 или null.

Я что-то упустил?

+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 (папка), '** И одна коррекция. ** URL-адрес должен быть как« url: »@ Url.Action (« ActionName »,« ControllerName », new {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"); 
    } 
}); 
Смежные вопросы