2011-04-12 5 views
2

J'ai une structure qui implémente IValidatableObject, que j'utilise pour les propriétés d'un modèle de vue. La validation fonctionne correctement avec les propriétés non nullable, mais si vous ajoutez une propriété de type Nullable <MyStruct> la méthode IValidatableObject.Validate n'est jamais appelée pour cette propriété, même si elle a une valeur.Types de valeur IValidatableObject et Nullable

Y a-t-il un moyen de déclencher la validation sur mes propriétés NULL, ou est-ce que IValidatableObject n'est pas destiné à être utilisé avec des types de valeur?

Merci


Informations complémentaires:

Je voulais être en mesure de préciser les unités lors de la saisie des données sous ma forme, par exemple 10m, 100km, 1cm etc. Je voulais aussi valider que les données saisies étaient à portée et d'un format correct. Ma structure convertit la chaîne avec des unités potentiellement différentes (100cm/100m/1km) en une propriété décimale qui a toujours la même unité (1/100/1000) et vice-versa.

J'ai utilisé IValidatableObject pour la validation car la validation sera toujours la même pour toute instance de MyStruct - Je ne voulais pas ajouter d'attribut chaque fois qu'il est utilisé.

Mon modèle ressemblerait à quelque chose comme ceci:

public class MyModel 
{ 
    public MyStruct Ab {get; set;} 
    public MyStruct? Cd {get; set;} 
} 

Mon point de vue est une vue fortement typé en utilisant le modèle, ce qui rend ma struct comme une zone de texte en utilisant un modèle d'affichage. Lorsque le formulaire est posté, j'ai un classeur de modèle personnalisé pour convertir la chaîne entrée à ma structure.

Mon action du contrôleur ressemble à:

public ActionResult MyAction(MyModel model) 
{ 
    //do stuff 
} 

Le modèle est lié ok pour les propriétés de type MyStruct et Nullable <MyStruct>.

+0

Pourriez-vous nous montrer le code que vous avez jusqu'ici pour votre modèle, contrôleur et vue? –

+0

J'ai mis à jour la question avec plus d'informations – Dan

Répondre

2

Il semble que ce ne soit pas possible.

J'ai creusé dans la source MVC. En System.Web.Mvc.DataAnnotationsModelValidatorProvider il y a le code suivant:

// Produce a validator if the type supports IValidatableObject 
if (typeof(IValidatableObject).IsAssignableFrom(metadata.ModelType)) { 
    //stuff 
} 

Selon this rejected bug report, Nullable<T> ne peut pas être affecté à une interface qui met en œuvre T:

"En bref, un" DateTime? "value peut être déconnecté à une valeur DateTime ou IFormattable, mais ne peut pas être affecté à un emplacement DateTime ou IFormattable."

Ainsi, aucun validateur n'est renvoyé.

On dirait que je vais devoir le faire d'une autre manière.

Questions connexes