Отправка данных JSON на контроллер MVC.Почему он не обрабатывает сложные типы? - PullRequest
1 голос
/ 24 марта 2011

Определить вспомогательные классы 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 из списка аргументов.

Одно слово: "ошеломленный"

Ответы [ 3 ]

3 голосов
/ 25 марта 2011

Вы пометили свой вопрос с помощью ASP.NET MVC 2, если это правильно, у вас нет встроенной поддержки связывания JSON. JsonValueProviderFactory доступен начиная с ASP.NET MVC 3. Чтобы связать JSON в предыдущих версиях ASP.NET MVC, необходимо создать поставщика значений или связыватель модели. Подробнее об этом можно прочитать здесь: Отправка JSON в метод действия ASP.NET MVC Аргумент

0 голосов
/ 25 марта 2011

Вам необходимо пометить ваш тип контента POST как json.Кроме того, MVC будет привязывать модель к вашей модели, поэтому вам не нужно использовать строку в качестве параметра действия.У Фила Хаака есть пример в его блоге.

0 голосов
/ 24 марта 2011

Во втором случае ожидаемыми данными поста является коллекция SelectedFile. Вы пробовали

$.ajax({url:"UploadFiles", type:'POST', traditional:true,  data: SelectedFiles, success: function(result){ alert(result);} });
...