Отправка данных JSON в контроллер MVC. Почему он не обрабатывает сложные типы?

Определите вспомогательные классы C # как:

`
открытый класс SelectedFiles {public string Host {get; набор; }

        public List<SelectedFile> Files { get; set; }
    }

    public class SelectedFile
    {

        public string ShortName {get; set;}

        public string Category { get; set; }


    }`

И давайте определим два метода контроллера (+ помощник Deserialize):

    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);} });      

Первый метод POST .ajax будет работать. По сути, выгрузка сериализованного объекта JSON в виде строки в метод контроллера.

Второй .ajax POST не работает. Кажется, он не понимает, как десериализовать вспомогательный класс SelectedFiles из списка аргументов.

Одно слово: "Flabergasted"


person Sentient    schedule 24.03.2011    source источник
comment
У вас возник актуальный вопрос?   -  person Erik Funkenbusch    schedule 24.03.2011
comment
Вопрос в том, почему это не работает? Я упустил что-то тривиальное? Это известное ограничение для части MVC?   -  person Sentient    schedule 24.03.2011


Ответы (3)


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

person tpeczek    schedule 25.03.2011
comment
Спасибо tpeczek. Вы правильно отметили тег MVC 2. Эта скрытая функция решает проблемы! - person Sentient; 25.03.2011

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

$.ajax({url:"UploadFiles", type:'POST', traditional:true,  data: SelectedFiles, success: function(result){ alert(result);} });
person amit_g    schedule 24.03.2011
comment
Я сделал, но не повезло. Это тоже было моей первой интуицией. - person Sentient; 25.03.2011

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

person Ryan    schedule 25.03.2011