2009-01-16 67 views
3

我目前正在使用ScriptService屬性啓用對我的Web服務的JSON調用。問題是我的一個類引用了第二個類,而.Net並沒有爲第二個類拾取和寫出JavaScript。將特定.net對象公開爲JSON

作爲解決方法,我可以編寫一個只返回第二個類的虛擬方法。然後,.Net寫入JSON以允許它被序列化。因此,在下面的例子:

[ScriptService] 
public class MyService : WebService { 
    [WebMethod] 
    public void SaveClass1(Class1 class1) { 
     ... 
    } 
} 

[Serializable] 
public class Class1 { 
    public Class2 class2 { get; set; } 
} 

[Serializable] 
public class Class2 { 
} 

MyService.asmx/JS不會寫代碼,讓我來實例化的Class2爲了讓我來填充的Class1。但我可以讓它工作,如果我添加:

[WebMethod] 
public Class2 Dummy() { 
    return new Class2(); 
} 

我的服務。任何替代我的討厭解決方法將不勝感激。

回答

4

您需要使用System.Web.Script.Services.GenerateScriptTypeAttribute,它指定應在生成的代理服務器代碼中包含服務器類型。您可以將此屬性應用於Web服務本身或任何標記爲WebMethodAttribute的方法。

例如:

[ScriptService] 
[GenerateScriptType(typeof(Class2))] 
public class MyService : WebService { 
    [WebMethod] 
    public void SaveClass1(Class1 class1) { 
     // ... 
    } 
} 
0

利,不知道這是否在您的JSON/[ScriptService]的場景,但將序列號Searcharoo.net我用System.Xml.Serialization.XmlInclude屬性上,我需要序列化「基地」類的對象圖。

基本上這告訴XmlSerializer約Class2,以便它可以包含在Class1序列化...有點像一個「選擇加入」的策略來處理對象的深層。

你想補充像這樣(在您的示例):

[Serializable] 
[System.Xml.Serialization.XmlInclude(typeof(Class2))] 
public class Class1 { 
    public Class2 class2 { get; set; } 
} 

...然後這個

[WebMethod] 
public void SaveClass1(Class1 class1) { 
    ... 
} 

Class2數據返回JSON內Class1

我做了一個快速谷歌找到troubleshooting...XmlSerializer這可能是一個很好的閱讀。 HTH

+0

XmlInclude用於包括在WSDL服務描述派生類型。在這個問題中,Class2不是從Class1派生出來的,服務器生成JavaScript代碼而不是WSDL服務描述。改用GenerateScriptTypeAttribute。 – 2009-02-24 08:31:34