2013-06-10 6 views
4

J'ai une méthode qui prend un modèle [AccountLinkRequest] en tant que paramètre avec des données codées en url. Il est utilise Json.NET par défaut, et aussi, je ne peux pas utiliser le paramètre UseDataContractJsonSerializer = true parce que je suis modèle de réponse de sortie générique (dans d'autres méthodes)Échec de la désérialisation de Web.Api pour un paramètre de modèle avec un nom différent

[HttpPost] 
public SomeResponse Link(AccountLinkRequest request) 
{ 
    if (request.CustomerId == null) 
     throw new Exception("Deserialization error here, pls help!"); 

    // other actions 
} 

Voici ma classe de modèle:

[DataContract] 
[JsonObject] 
public class AlertAccountLinkRequest 
{ 
    [DataMember(Name = "id")] 
    public string id { get; set; } 

    [DataMember(Name = "customer_id")] 
    [JsonProperty("customer_id")] 
    public string CustomerId { get; set; } 
} 

Le problème: request.CustomerId est AllWays null. La demande est assez simple:

web_service_URL/link = customer_id customer_id & id = id (url-encoded)

si j'utilise CUSTOMER_ID au lieu de CustomerId, tout ira bien, mais je suis sur un jedy? -façon. Je vous remercie!

Répondre

1

Il n'existe pas de réponse simple pour y parvenir. Pour plus de détails s'il vous plaît lire ceci:

How to bind to custom objects in action signatures in MVC/WebAPI

Résumé:

  1. appeler manuellement la fonction d'analyse à l'intérieur de votre action
  2. Utilisez un TypeConverter pour rendre le type complexe soit simple
  3. Utilisation un classeur modèle personnalisé

Donc, si vous pour insta nce créer votre 'SmartBinder' qui est capable de consommer certains attributs, vous pouvez obtenir ce que vous voulez. En dehors de la boîte il n'y a pas de fonctionnalité pour cela, juste les conventions de nommage ...

+0

Radim, merci pour votre réponse. Je ne peux toujours pas croire que DataMember/JsonProperty ne le servent pas. C'est la même chose qu'avec ORM, nous ne pouvions pas définir ses propres noms de propriétés au lieu d'utiliser des noms de colonnes. Btw il y avait JSON.NET 5.0+ mise à jour, mais rien n'a changé – EvgeniyK

+1

Dans ce cas, nous parlons de ModelBinder. Nous voulons changer une requête (partie de la chaîne de requête) à convertir en objet. Seules les 3 méthodes mentionnées ci-dessus sont disponibles. Ce dont vous parlez, c'est l'analyse du CORPS. Et pour cela, nous utilisons MediaFormatters. Et ceux-ci pourraient être très puissants, modifiables, extandables ... Donc, il y a la plus grande différence. Requête vs BODY. Le corps de la demande peut contenir un attribut JSON JSON (par exemple '[JsonProperty (PropertyName = '')]') pourrait être utilisé ... pas dans ce cas. mauvaises nouvelles je sais; ( –

+0

Maintenant je vois, merci! – EvgeniyK

Questions connexes