2012-11-14 93 views
0

之間JSON數據反串行化差異:MVC3,我提出以下控制器的方法,其經由JSON處理請求數據從C#請求和Javascript

public virtual JsonResult ExecMethod([SomeRequestBind(RequestType="Method")] RequestObject request) 

SomeRequestBind是選擇從RequestObject,例如派生類型的屬性。

public class RequestObjectGetSettings : RequestObject 
    { 
     public new AuthLoginParams Auth { get; set; } 
     public string Method <- this is derived from RequestObjects 
    } 

AuthLoginParams這個對象包含兩個屬性

public class AuthLoginParams : AuthParams 
    { 
     [Required] 
     public string Name {get; set;} 

     [Required] 
     public string Pass {get; set;} 
    } 

的我做了一些測試項目(C#),其執行以下操作:

var request1 = new 
     { 
      Auth = new { Name = "whatever", Pass = "some_pass" }, 
      Method = "GetSettings", 
     }; 

using (var wc = new WebClient()) 
     { 
      wc.Headers[HttpRequestHeader.ContentType] = "application/json; charset=utf-8"; 
      wc.Headers[HttpRequestHeader.AcceptLanguage] = "pl"; 
      try 
      { 
       Console.WriteLine(serializer.Serialize(request1)); 
       HtmlResult = wc.UploadString(URI, serializer.Serialize(request1)); 
       Console.WriteLine(HtmlResult); 
      } 
      catch (WebException) 
      { 
       Console.WriteLine("SomeError"); 
      } 
     } 

這樣,所有的作品完美,我的意思是對象正確初始化。

不過。我嘗試同樣從JavaScript:

   var message2 = { 
        Auth:{ 
         Name:"whatever", 
         Pass:"goodPass" 
        }, 
        Method:"GetSettings" 
       }; 

       $("#message").text(JSON.stringify(message2)); 
       $.post("http://127.0.0.1:6661/ApiMethod",message2,{},"json"); 

       /*$.ajax({ 
        url:"http://127.0.0.1:6661/ApiMethod", 
        type:"post", 
        data:message2, 
        ContentType:"application/json; charset=utf-8", 
        dataType:"json" 
        }); 
       */ 

當我傳遞消息2作爲對象後,控制器上的這臺Method屬性,但是從AuthLogin屬性爲null。當我嘗試JSON.stringify時,它不會初始化任何東西。當我接過來一看變成螢火蟲,我觀察後的參數是:

驗證【品名】blabalbla

驗證[通] XXXXXX

方法的getSettings

而且現在看來,它涉及到對控制器以類似的方式,所以它不能讀取這個對象的屬性。所以,現在看來,認爲與其類似:

{Auth:{Name:"aaa",Pass:"aaa"},Method:"GetSettings"} 

它向服務器發送:

{Auth[Name]:"aaa",Auth[Pass]:"aaa",Method:"GetSettings"} 

所以,對象是扁平的而不是嵌套。

如何正確發送此對象?

回答

0

嘗試一下本作的jQuery的崗位

$.post("http://127.0.0.1:6661/ApiMethod",message2); 

編輯 你調用jQuery的document.ready事件中的$。員額,是否正確? 也嘗試更改屬性的名稱。這應該沒有什麼不同,但它值得一試。嘗試

{ 
    Authentication: {Name:'name', Password:'pwd'}, 
    Method: 'method name' 
} 

另一種選擇是簡單地弄平物體。在這種情況下,通過授權模式沒有任何好處。

{ 
    Name:'name', 
    Password:'pwd', 
    Method: 'method name' 
} 
+0

我試過了,它也沒有初始化。在JSON.serialize和C#序列化之後,我還查看了字符串 - 字符串看起來相同。 看來,由於我還不知道的原因,在Javascript中嵌套的身份驗證被傳送到Auth [Name]中。 – Pawel

+0

'Auth [Name]'&'Auth.Name'在js中是一樣的。 –

+0

對於遲到的回答感到抱歉。我希望不要弄平物體 - 好吧...目前;) 從我觀察到的是,$ .ajax或$ .post發送表單中的事後數據(將數據放入Request.Form屬性中),並且它們確實將對象放入〜'「Auth [Name ]「:」aaa「,」Auth [Pass]「'這似乎是問題的活頁夾(是的,對於JS他們是平等的)。使用C#JSON序列化到''Auth「:{」Name「:」aaa「,」Pass「:」aaa「}'這對於活頁夾是合適的。同樣的結果給了'JSON.stringify'方法。 因爲我需要這個測試目的,我安裝了海報擴展到Firefox,它允許我測試這個。非常感謝您的幫助。 – Pawel