2009-01-16 9 views
3

J'active actuellement les appels JSON à mes services Web à l'aide de l'attribut ScriptService. Le problème est que l'une de mes classes fait référence à une seconde classe et que .Net ne récupère pas et n'écrit pas le JavaScript pour la deuxième classe. En guise de solution de contournement, je peux écrire une méthode factice qui retourne juste la deuxième classe. Ensuite, .Net écrit le JSON pour lui permettre d'être sérialisé. Ainsi, dans l'exemple suivant:Expose un objet .net spécifique en tant que 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 n'écrire du code pour me permettre de instancier Classe2 afin de me remplir Class1. Mais je peux le faire fonctionner si j'ajoute:

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

à MyService. Toute alternative à ma vilaine solution de contournement serait grandement appréciée.

Répondre

4

Vous devez utiliser System.Web.Script.Services.GenerateScriptTypeAttribute, qui spécifie qu'un type de serveur doit être inclus dans le code de proxy généré. Vous pouvez appliquer cet attribut au service Web lui-même ou à toute méthode marquée avec WebMethodAttribute.

Par exemple:

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

Lee, pas sûr que cela fonctionne dans votre JSON/scénario [ScriptService], mais sérialiser un objet graphique dans Searcharoo.net je l'attribut System.Xml.Serialization.XmlInclude de la classe « base » que je devais sérialisation. Fondamentalement, cela indique au XmlSerializer à propos de Class2 afin qu'il puisse être inclus dans la sérialisation Class1 ... un peu comme une stratégie "opt-in" pour gérer les hiérarchies profondes des objets.

Vous ajouteriez comme ça (dans votre exemple):

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

... puis ce

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

doit retourner JSON avec Class2 données à l'intérieur Class1.

J'ai fait un google rapide pour trouver troubleshooting...XmlSerializer qui pourrait être une bonne lecture. HTH

+0

XmlInclude est utilisé pour inclure des types dérivés dans les descriptions de services WSDL. Dans cette question, Class2 n'est pas dérivé de Class1 et le serveur génère du code JavaScript pas une description de service WSDL. Utilisez plutôt GenerateScriptTypeAttribute. –

Questions connexes