9
votes

Impossible de définir des noms de membre de l'attribut de validation personnalisé dans MVC2

J'ai créé un attribut de validation personnalisé par sous-classement validationAttribute. L'attribut est appliqué à mon point de vue au niveau de la classe car il doit valider plus d'une propriété.

Je suis remplace xxx

et retourne: < PRE> XXX

Dans tous les cas où DateOfbirth est l'une des propriétés de mon modèle de vue.

Quand j'exécute mon application, je peux voir que cela se fait frapper. Modelstate.isvalid est défini sur False correctement, mais lorsque j'inspecte le contenu de la modélisation, je vois que la propriété Datefbirth ne contient aucune erreur. Au lieu de cela, j'ai une touche de chaîne vide avec une valeur de NULL et une exception contenant la chaîne que j'ai spécifiée dans mon attribut de validation.

Il n'y a pas de message d'erreur non affiché dans mon UI lors de l'utilisation de validationMessageFor. Si j'utilise validationsummary, je peux voir l'erreur. C'est parce que ce n'est pas associé à une propriété.

Il semble que cela ignore le fait que j'ai spécifié le nom de membre dans le résultat de la validation.

Pourquoi est-ce et comment Est-ce que je le répare?

Exemple de code comme demandé: xxx


0 commentaires

4 Réponses :


-1
votes

Vous devez définir la propriété errorressage, donc par exemple: xxx


2 commentaires

Le message d'erreur est en cours de réglage et passe bien comme expliqué ci-dessus. Le problème est avec le nom de membre qui devrait mapper sur la clé du modèle de modèle.


Pouvez-vous publier votre code alors, cela pourrait vous faciliter l'aide



2
votes

Je ne suis pas au courant d'une solution facile à résoudre ce problème. C'est l'une des raisons pour lesquelles je déteste les annotations de données. Faire la même chose avec fluentvalidation serait une paix de gâteau: xxx

fluentvalidation a de superbe support et Intégration avec ASP.NET MVC .


1 commentaires

Merci. L'équipe MVC réutilise donc la classe ValidationResult mais ignore complètement l'une des propriétés? Dans l'ensemble, je suis extrêmement impressionné par la production de l'équipe MVC, mais c'est plutôt mauvais. Je viens de le vérifier dans mvc3 / .net4 et c'est toujours la même chose.



14
votes

Bonjour tout le monde.

toujours à la recherche de solution?

J'ai résolu le même problème aujourd'hui. Vous devez créer un attribut de validation personnalisé qui validera 2 dates (exemple ci-dessous). Ensuite, vous avez besoin d'adaptateur (validateur) qui validera le modèle avec votre attribut personnalisé. Et la dernière chose est une adaptateur contraignante avec attribut. Peut-être qu'un exemple va l'expliquer mieux que moi :)

Nous allons ici:

datecompareattribute.cs.cs CS: xxx

global.asax: xxx

personnaliséviewModel.cs: xxx


3 commentaires

Bon travail. Dans MVC3, vous pouvez accéder à d'autres propriétés d'un attribut de niveau de propriété en utilisant la propriété validationContext.Objectstance, qui fonctionne bien pour moi. Vous pouvez voir un exemple ici: FavCode.net/Browse/.../a>


Sérieusement, c'est la solution.


Toute façon d'avoir ce côté de la clientèle de validation?



0
votes

Lors du retour du résultat de validation, utilisez le constructeur de deux paramètres. Passez-le un tableau avec le contexte.Membername comme la seule valeur. J'espère que cela aide

<AttributeUsage(AttributeTargets.Property Or AttributeTargets.Field, AllowMultiple:=False)>


Public Class NonNegativeAttribute
Inherits ValidationAttribute
Public Sub New()


End Sub
Protected Overrides Function IsValid(num As Object, context As ValidationContext) As ValidationResult
    Dim t = num.GetType()
    If (t.IsValueType AndAlso Not t.IsAssignableFrom(GetType(String))) Then

        If ((num >= 0)) Then
            Return ValidationResult.Success
        End If
        Return New ValidationResult(context.MemberName & " must be a positive number",     New String() {context.MemberName})

    End If

    Throw New ValidationException(t.FullName + " is not a valid type. Must be a number")
End Function

End Class


0 commentaires