Question

Il y a une abondance de très bon poste et des explications comment mettre en œuvre la validation avec ASP.NET MVC, et je préfère l'un de ces:

Cependant, j'aime vraiment appeler ActionMethods via la méthode jquery .ajax de $. L'une des raisons pour lesquelles je veux utiliser .ajax $ est parce qu'il y aura beaucoup de vues partielles chargées dans la page dynamique (même la forme pour la création d'entités) via .ajax $ appels et je ne peux pas retourner la vue - Je vais perdre tout le contenu chargé dynamiquement.

Pour vous donner une meilleure vue sur le problème, je posterai un code simple à expliquer comment pourrais-je appeler des actions de contrôleurs et de gérer les réponses au client, le code jquery.

Les contrôleurs ActionMethod:

    public ActionResult CreateCustomer(string name, string accountNumber)
    {
        try
        {
            CustomerService.InsertCustomer(name, accountNumber);

            return Json(new ActionInfo()
            {
                Success = true,
                Message = "Customer Is Successfully Created"
            });

        }
        catch (Exception ex)
        {
            return Json(new ActionInfo()
            {
                Success = false,
                Message = ex.Message
            });
        }
    }

Appel et la manipulation dans le code client:

$.ajax({
type: "POST",
url: $form.attr('action'),// /MyController/CreateCustomer
data: $form.serialize(),
error: HandleUnespectedError,
dataType: "json",
success: function(response) {

    if (response.Success)
        alert("Success: " + response.Message);
    else
        alert("Error: " + response.Message);
}});

Y at-il un bon moyen de faire un peu de ces cadres de validation pour travailler la façon dont je besoin? Je sais que je peux ajouter des erreurs de validation dans ActionInfo, puis le manipuler dans le client, mais qui être déjà un immeuble de ma seule validation, je crois.

Était-ce utile?

La solution

J'ai eu beaucoup de succès à faire la validation via AJAX en utilisant les attributs des annotations de données. Afin de vérifier la validité de vos données, vous voulez utiliser la propriété ModelState du contrôleur, qui a une propriété de son propre appelé IsValid. Je suggère fortement de prendre un coup d'oeil les données annotations validation des attributs tutoriel à partir du site ASP.NET MVC officiel.

Tout d'abord, vous voulez modifier votre action de contrôleur pour accepter votre modèle objet comme paramètre, plutôt que d'un autre nom et numéro de compte. Cela fera effectuer la validation, que je vais le démontrer ci-dessous, beaucoup plus simple. A partir de votre exemple, ma meilleure estimation est que votre modèle d'objet est, ou serait, appelé Client. Vous pourriez avoir le code suivant pour définir l'objet modèle et votre action de contrôleur ...

// model object
public class Customer
{
  public Int32 Id {get; set;}
  public String Name {get; set;}
  public String AccountNumber {get; set;}
}

// controller
public class CustomerController : Controller
{
  public ActionResult CreateCustomer( [Bind(Exclude = "Id")] Customer customer )
  {
     // controller action code
  }
}

Assurez-vous que vos champs de formulaire sont nommés pour faire correspondre les noms des propriétés de l'objet client si ASP.NET MVC peut automagiquement les lier. L'attribut « Bind », dans ce cas, est dit ASP.NET MVC d'ignorer la propriété « Id » de la classe client lorsque les champs de formulaire de liaison pour modéliser les propriétés. Étant donné que c'est un nouveau client, nous n'avons pas encore Id, afin que nous puissions laisser en toute sécurité l'Id comme quelle que soit la valeur par défaut est et laisser la couche de données pour déterminer la meilleure façon de générer.

Une fois que le contrôleur a construit l'objet de modèle pour la méthode d'action, sa validité peut être facilement vérifié par l'intermédiaire de la propriété ModelState.IsValid. Comme on pouvait s'y attendre, il retourne vrai si les propriétés du modèle sont valides ou faux si 1 ou plusieurs propriétés ne sont pas valides.

De la question initiale, il semble que la méthode de CustomerService.InsertCustomer est de lancer des exceptions lorsque la validation échoue. Ceci est tout à fait inutile. InsertCustomer ne devrait avoir besoin d'effectuer ce que les opérations de données sont nécessaires pour insérer le nouveau record. À moins que vous souhaitez la mise en œuvre abstraite exceptions spécifiques, comme SqlException, InsertCustomer ne devrait pas vraiment besoin d'attraper ou de jeter des exceptions, mais peut très probablement simplement laisser une bulle d'exceptions à la commande (ou quel que soit l'appelant peut être).

Le résultat final de tout cela, peut-être une action de contrôleur qui ressemble à ce qui suit:

public ActionResult CreateCustomer( [Bind(Exclude = "Id")] Customer customer )
{
  // model is invalid
  if (!ModelState.IsValid)
  {
    return Json(new ActionInfo()
    {
      Success = false,
      Message = "Validation failed" // you will probably want a more robust message :-)
    });
  }

  // service method accepts a Customer object rather than arbitrary strings  
  CustomerService.InsertCustomer(customer);

  return Json(new ActionInfo()
  {
    Success = true,
    Message = "Customer created successfully."
  });

}

Si vous voulez signaler des erreurs inattendues, comme des exceptions liées à la base de données, vous pouvez certainement ajouter un bloc try / catch autour de l'appel à InsertCustomer, et renvoyer le résultat nécessaire pour afficher le message d'erreur au client.

Autres conseils

Ceci est plus d'un an après avoir posé votre question, mais j'ai couvert la validation côté serveur avec l'Ajax appelle dans mon

scroll top