/ / IgnoreDataMember: l'attribut ignore les propriétés de l'objet JSON lors de la sérialisation ** DE ** - asp.net-mvc, json, validation, attributs, asp.net-web-api

L'attribut IgnoreDataMember ignore les propriétés de l'objet JSON lors de la sérialisation ** DE ** - asp.net-mvc, json, validation, attributs, asp.net-web-api

Selon les docs, l’attribut IgnoreDataMember n’est censé être pris en compte que lors de la sérialisation.

D'après ce que je vois, cependant, le modèle de liaison MVC l'utilise pendant *de* la sérialisation de json aussi.

Considérez la classe suivante:

public class Tax
{
public Tax() { }

public int ID { get; set; }

[Required]
[Range(1, int.MaxValue)]
[IgnoreDataMember]
public int PropertyId { get; set; }
}

Si POST / PUT la chaîne json suivante à une méthode d'action:

{"Position":0,"Description":"State sales tax","Rate":5,"RateIsPercent":true,"PropertyId":1912}

Je reçois l'erreur de validation suivante:

{
"Message": "The request is invalid.",
"ModelState": {
"newTax.PropertyId": [
"The field PropertyId must be between 1 and 2147483647."
]
}
}

Les deux [Range(1, int.MaxValue)] et [Required] les attributs sont invalides.

Si je retire le [IgnoreDataMember] attribut, tout fonctionne bien.

Existe-t-il un autre attribut qui peut être utilisé pour indiquer à la liaison MVC de ne pas ignorer la propriété pendant la désérialisation?

Cela se produit uniquement lors de la publication d'une chaîne JSON. Si je poste une chaîne de nom / valeur, tout fonctionne correctement.

Réponses:

2 pour la réponse № 1

La réponse concerne le comportement de Json.net. C’est ce que le modèle utilise et sa vérification IgnoreDataMember à la fois pour la sérialisation et la désérialisation le rendant inutile pour moi (puisque je veux l'utiliser uniquement pour la sérialisation).

le JsonIgnore attribut fonctionne exactement de la même manière.

Etant donné cela, j’ai retiré tous les attributs ignore de mes propriétés et suis passé à l’utilisation des méthodes de sérialisation conditionnelle de json.net.

Donc, fondamentalement, ajoutez ceci pour le champ PropertyId ci-dessus:

public bool ShouldSerializePropertyId() { return false; }

Cela permet à la désérialisation d'entrer mais empêche la sérialisation de sortir.