2011-03-24 37 views
1

定義C#輔助類爲:將JSON數據提交給MVC控制器。爲什麼它不處理複雜類型?

'
公共類SelectedFiles { 公共字符串主機{獲得;組; }

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

第阿賈克斯POST方法會奏效。基本上將序列化的JSON對象作爲字符串轉儲到控制器方法。

第二個.ajax POST不起作用。它似乎沒有弄清楚如何從參數列表中反序列化'SelectedFiles'輔助類。

一個詞:「Flabergasted」

+0

你有沒有真正的問題? – 2011-03-24 19:16:18

+0

問題是「爲什麼這不起作用」?我錯過了一些微不足道的東西嗎?這是MVC部分的一個已知限制嗎? – Sentient 2011-03-24 19:18:05

回答

3

你已經用ASP.NET MVC 2標記了你的問題,如果這是正確的,你沒有開箱即用的JSON綁定支持。 JsonValueProviderFactory自ASP.NET MVC 3起可用。要在先前版本的ASP.NET MVC中綁定JSON,您需要創建值提供程序或模型聯編程序。你可以在這裏閱讀更多關於它的信息:Sending JSON to an ASP.NET MVC Action Method Argument

+0

謝謝tpeczek。您正確記下了MVC 2標籤。這個隱藏的功能正在解決問題! – Sentient 2011-03-25 18:42:32

0

在第二種情況下,預計後期數據是SelectedFile的集合。您是否嘗試過

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

我做到了,但沒有運氣。這樣調用也是我的第一個直覺。 – Sentient 2011-03-24 23:24:17

0

您需要將您的POST內容標記爲json。此外,MVC將模型綁定到您的模型,因此您不需要使用字符串作爲操作參數。 Phil Haack在他的博客上有一個example

相關問題