Validation personnalisée avec annotations de données

asp.net-mvc data-annotations entity-framework

Question

J'utilise des annotations de données pour vérifier les données saisies, mais je suis bloqué par une méthode plus personnalisée de validation des données.

Je dois exécuter des requêtes sur la base de données pour voir si des éléments existent ou non, puis signaler à l'utilisateur si une "erreur de vérification de la base de données personnalisée" apparaît, telle que "Le nom de la société existe déjà"

Comment puis-je mettre en œuvre une telle chose avec dataannotations?

J'ai toutes les requêtes faites etc. en utilisant linq et le framework d'entité fourni avec 3.5sp1

/ M

Réponse acceptée

Attributs personnalisés qui étendent les annotations de données

Vous devrez écrire vos propres attributs qui effectueront la validation de votre instance d'objet par rapport au magasin de données.

Assurez-vous que vos classes héritent de la classe System.ComponentModel.DataAnnotations.ValidationAttribute :

public class MustNotExist: ValidationAttribute
{
    ...
}

Mise en garde

J'ai rencontré une situation similaire dans laquelle je devais valider que l'objet est unique dans le magasin de données. Mais ce type de validation n’était pas possible sur la classe d’entité elle-même, car elle ne devrait fonctionner que pour les entités en cours de création, mais pas lorsque vous renvoyez déjà votre entité à partir du magasin de données.

Ma solution était d'avoir une interface, une classe et un attribut séparés.

public interface IExternalValidator ...

class DBUniqueValidator: IExternalValidator ...

class ValidateExternallyAttribute: FilterAttribute, IActionFilter
{
    ...
    public ValidateExternallyAttribute(Type validatorType, Type entityType) ...
    ...
}

J'ai pu placer mon attribut sur des actions du contrôleur qui obtiennent des paramètres d'entité. L'attribut Action de filtrage vérifie ensuite les paramètres d'action du contrôleur (celui-ci peut facilement accéder à leurs types et leurs valeurs), exécute un validateur externe en fonction des paramètres corrects (types fournis dans la définition d'attribut) et renseigne les erreurs ModelState en cas d'échec de la validation.

[ValidateExternally(typeof(DBUniqueValidator), typeof(User))]
public ActionResult RegisterUser(User newUser)
{
    if (!this.ModelState.IsValid)
    {
        // act accordingly - probably return some error depending on model state errors
    }
    // register new user in data store
}

De cette façon, je pouvais exécuter une validation externe uniquement sur les actions qui en avaient réellement besoin, et cette technique a également aidé le code des actions de mon contrôleur à rester propre et à court terme. Tout ce que je devais faire était de vérifier s'il y avait des erreurs d'état du modèle.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi