Question

Je veux créer un ModelBinder personnalisé qui valide le modèle borné. J'ai trouvé plusieurs exemples et il fonctionne comme il se doit. Mais je veux aussi être en mesure d'envoyer le dos de l'utilisateur à la page il est venu s'il y a des erreurs dans le modèle.

Est-ce possible de faire et quels sont les effets secondaires évidents en faisant cela?

Ce que je veux réaliser est que le contrôleur obtient toujours des commandes valides, donc je ne ai pas besoin de vérifier model.IsValid () dans la méthode d'action.

Était-ce utile?

La solution

Qu'est-ce que vous essayez de faire semble bon, mais il ne fonctionnera pas. Il est trop de restrictions.

  1. En général, seul contrôleur peut décider où rediriger en cas d'erreur. Vous pouvez utiliser des attributs supplémentaires comme [OnError ( « Action »)], mais cela ressemble à des solutions de contournement.
  2. Formulaire ne publie pas toutes les données . Par exemple, listes déroulantes, les valeurs auxiliaires doivent être remplies par le contrôleur. Vous pouvez probablement utiliser des filtres d'action pour cela, mais c'est ressemble encore une fois comme un hack.

Vous pouvez configurer le filtre d'action global (sur le contrôleur de base) qui vérifie les erreurs de modèle (que les ensembles de liant) et redirect (configuration .Result). Mais cela est compliqué et nécessite trop extra « code » - attributs, etc., qui est alors difficile à suivre et se rapportent à la logique de l'application réelle. Et il devient bientôt trop restrictive (voir la loi de l'abstraction qui fuit), quand vous ne devez pas le nom d'action juste simple sur redirect d'erreur, etc.

Cela ressemble beaucoup plus simple lorsque vous avez terminé comme ceci:

public ActionResult PostAction(ViewModel data)
{
   if (!ModelState.IsValid)
      return View("GetAction", data.WithDropDownList(repository.GetProducts()));

}

Dans l'exemple ci-dessus, le contrôleur a le contrôle sur le flux de travail, tout comme il devrait être. Il a également la liberté d'effectuer une vérification / configuration supplémentaire. Vous pouvez toujours utiliser autant que possible l'infrastructure - classeurs modèles pour fournir des erreurs ModelState, etc -., Mais devrait avoir seul contrôleur la décision finale sur l'entrée et la sortie

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top