Определить вспомогательные классы C # как:
`
открытый класс SelectedFiles
{
публичная строка Host {get; задавать; }
public List<SelectedFile> Files { get; set; }
}
public class SelectedFile
{
public string ShortName {get; set;}
public string Category { get; set; }
}`
И давайте определим два метода контроллера (+ Десериализация помощника):
private SelectedFiles Deserialize(string json)
{
using (MemoryStream stream = new MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(json)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(SelectedFiles));
return (SelectedFiles) serializer.ReadObject(stream);
}
}
/// <summary>
/// MVC seems to be incapable to deserizalize complex types.
/// </summary>
/// <param name="selectedFilesJSON"></param>
/// <returns></returns>
public void UploadFiles(SelectedFiles selectedFilesJSON)
{
var result = selectedFilesJSON;
}
/// <summary>
/// </summary>
/// <param name="selectedFilesJSON"></param>
/// <returns></returns>
public void UploadFilesJSON(string selectedFilesJSON)
{
if (!string.IsNullOrEmpty(selectedFilesJSON))
{
var result = this.Deserialize(selectedFilesJSON);
}
}
с вызовом JavaScript
var SelectedFiles = [];
var SelectedFile;
selectedCheckBoxes.each(function(idx, element){
SelectedFile = {ShortName: element.value, Category: "a category"};
SelectedFiles.push(SelectedFile);
});
var selectedFileMessage = {};
selectedFileMessage.Host = "test"
selectedFileMessage.Files = SelectedFiles;
var message = $.toJSON(selectedFileMessage);
$.ajax({url:"UploadFilesJSON", type:'POST', traditional:true, data: { selectedFilesJSON : message } , success: function(result){ alert(result);} });
$.ajax({url:"UploadFiles", type:'POST', traditional:true, data: { selectedFilesJSON : selectedFileMessage } , success: function(result){ alert(result);} });
Первый метод .ajax POST будет работать. В основном дамп сериализованного объекта JSON в виде строки в метод контроллера.
Второй .ajax POST не работает. Кажется, он не понимает, как десериализовать вспомогательный класс SelectedFiles из списка аргументов.
Одно слово: "ошеломленный"