Question

J'utilise la couche de service avec un ModelStateWrapper comme indiqué ici .

Quelle est la bonne façon de contrôler les clés d'erreur à utiliser lors de la validation dans la couche de service afin qu'elles correspondent aux noms d'entrée dans mes vues?

par exemple J'ai le ViewModel suivant pour un client:

public class CustomerViewModel
{
    public string Name { get; set; }
    /*…*/
}

Et le ViewModel suivant pour certains cas d'utilisation View (l'utilisateur peut créer deux clients à la volée dans ce cas d'utilisation en entrant leurs noms):

public class SomeOtherUseCaseViewModel
{
    public CustomerViewModel BuyingCustomer { get; set; }
    public CustomerViewModel SellingCustomer { get; set; }
    /*… */
}

Ce que j'utilise dans la vue comme ceci:

<!-- … -->
<%: Html.EditorFor(model => model.BuyingCustomer.Name) %>
<%: Html.ValidationMessageFor(model => model.BuyingCustomer.Name) %>
<!-- … -->
<%: Html.EditorFor(model => model.SellingCustomer.Name) %>
<%: Html.ValidationMessageFor(model => model.SellingCustomer.Name) %>

Dans mon service client, j'ai la méthode de validation suivante qui est appelée lors de la création du client (notez qu'il s'agit d'une classe de client différente, il s'agit d'une classe de domaine):

public bool ValidateCustomer(Customer customer)
{
    /* Check if there is another customer with the same name */
    if (/*…*/)
    {
        _validationDictionary.addError(“Name”, “There is another customer with the same name”); //the _validationDictionary holds the ModelStateWrapper
        return false;
    }
}

Voyez-vous mon problème?

En fonction de la vue, l'erreur doit être ajoutée avec la clé “BuyingCustomer.Name” ou “SellingCustomer.Name” (ou éventuellement il y aura deux erreurs, une avec chaque clé) au lieu de simplement "Name"; sinon, le cadre ne mettra pas en évidence correctement les champs et affichera les erreurs.

Quelle est la bonne façon de résoudre correctement cette situation? Je ne souhaite pas transmettre le "préfixe de clé d'erreur" à la couche de service, car il s'agit d'un problème d'interface utilisateur et non de couche de service , (non?).

Était-ce utile?

La solution

Je prendrais cela plus tard, vous interrogez le service pour des erreurs de validation?

Soit le service interroge immédiatement après la validation, puis réinitialise les erreurs, soit la méthode appelle les erreurs de validation de retour. Si vous faites l'une ou l'autre de ces méthodes, vous pouvez les préfixer avec (prefix (this validationDictionaryObject, string pfx)) une méthode d'extension pour le dictionnaire, l'API ne serait pas trop mauvaise de cette façon. Une deuxième méthode d'extension (HasErrors ()) pour le dictionnaire ferait la même chose que votre retour booléen

Pour le problème que vous rencontrez seul, j'ai tendance à éviter d'interroger le service pour les erreurs.

Il est pratique que le service les rassemble tous, mais vous ajoutez ensuite un état d'erreur à un service qui n'appartient pas vraiment, ce n'est pas que le service est cassé, mais un modèle qu'il a vérifié l'était. Si vous devez appeler à nouveau ce service (comme vous le faites), il a un ancien état. Vous devez gérer cela. Soit cela, soit des erreurs de retour car après tout, c'est une méthode de validation. Demandez-lui de renvoyer les résultats de validation. :)

var errs = service.ValidateCustomer(sellinCustomer);
if (errs.HasErrors()){
   errs.Prefix("SellingCustomer");
   //add to model state dictionary for view here.
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top