之間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"}
所以,對象是扁平的而不是嵌套。
如何正確發送此對象?
我試過了,它也沒有初始化。在JSON.serialize和C#序列化之後,我還查看了字符串 - 字符串看起來相同。 看來,由於我還不知道的原因,在Javascript中嵌套的身份驗證被傳送到Auth [Name]中。 – Pawel
'Auth [Name]'&'Auth.Name'在js中是一樣的。 –
對於遲到的回答感到抱歉。我希望不要弄平物體 - 好吧...目前;) 從我觀察到的是,$ .ajax或$ .post發送表單中的事後數據(將數據放入Request.Form屬性中),並且它們確實將對象放入〜'「Auth [Name ]「:」aaa「,」Auth [Pass]「'這似乎是問題的活頁夾(是的,對於JS他們是平等的)。使用C#JSON序列化到''Auth「:{」Name「:」aaa「,」Pass「:」aaa「}'這對於活頁夾是合適的。同樣的結果給了'JSON.stringify'方法。 因爲我需要這個測試目的,我安裝了海報擴展到Firefox,它允許我測試這個。非常感謝您的幫助。 – Pawel