2011-09-16 8 views
2

Salut, je suis nouveau à MVC et EF donc c'est une question très simple, mais quel est le meilleur moyen d'empêcher l'utilisateur d'essayer d'entrer des enregistrements en double?MVC Entity Framework validation pour éviter les enregistrements en double

J'ai une simple table de consultation avec une colonne qui est la clé primaire. Je crée un écran de maintenance afin que les administrateurs puissent ajouter des éléments supplémentaires à la liste de recherche. Mon contrôleur ressemble à:

public ActionResult Index(string NewRow) 
    { 
     try 
     { 
      CaseType t = new CaseType { ID = NewRow }; 
      if (ModelState.IsValid) 
      { 
       UOW.CaseTypes.Add(t); 
       UOW.Save(); 
      } 
     } 
     catch (Exception ex) 
     { 
      ModelState.AddModelError("", ex.Message); 
     } 
     return View(UOW.CaseTypes.All()); 
    } 

qui arrête les enregistrements en double et arrête l'écran jaune de la mort, mais le message affiché est: « Une erreur est survenue lors de l'actualisation des entrées Voir l'exception interne pour plus de détails. ». ce qui n'est pas bon pour les utilisateurs.

Je me demandais juste s'il y avait une meilleure façon d'attraper l'erreur.

Répondre

3

Pour toute erreur de validation show-je utiliser quelque chose comme ceci:

MainEmail sa propriété de ViewModel

 var mod = ModelState.First(c => c.Key == "MainEmail"); // this 
     mod.Value.Errors.Add("Row's shouldn't duplicates."); // this 

     if (ModelState.IsValid) 
     { 
      return RedirectToAction("Details"); 
     } 

     return View(client); 

Erreur affichera de dans ce domaine en vue:

<div class="editor-label"> 
     @Html.LabelFor(model => model.MainEmail) 
    </div> 

Et pour l'avenir, vous devez cacher votre écran d'erreur! Vous devez afficher une page d'erreur personnalisée:

Si vous utilisez asp-mvc-3, ajouter à web.config cette chaîne:

<system.web> 
    <customErrors mode="On" defaultRedirect="~/Error" /> 
    ... 

Et les utilisateurs auront la page /Shared/Error.cshtml insted de page avec message d'exception (qui peut afficher des données de séquence).

ADD

A propos de la création de contrainte unique a été discuté ici Unique Constraint in Entity Framework Code First

que vous pouvez vérifier à propos de la duplication des enregistrements avec votre code d'essai.

Dans mon application, j'utilise d'abord le code et je n'ajoute pas de contrainte unique car cela conduit à une faible testabilité. Dans ce cas, utilisez simple. Recherchez avant d'enregistrer les modifications.

La première approche est un peu plus rapide.

L'approche deux est testabilité grandir.

+0

Hmm ... ma réponse ne vous aidera pas? –

+0

excellent merci, et je prévoyais de supprimer l'écran d'erreur son juste en développement en ce moment, mais merci pour la pointe supérieure. – Jammy

+0

Salut, je viens de me débrouiller avec ça et même si votre code est utile, il ne réalise pas ce que je cherchais. Il semble juste chercher un champ dans les données de forme et ajouter un message de validation.Je cherchais un moyen de vérifier les doublons, par exemple si j'ai déjà le cas "22" dans la table et à un moment donné un utilisateur essaie de créer un autre "22" le système devrait dire "Désolé c'est un doublon" plutôt que "bam" écran jaune de la mort. Je me demandais juste si je devrais d'abord lancer une recherche sur les données ou attraper l'erreur qui est moins de pression sur le serveur? – Jammy

0

Si vous voulez obtenir l'exception interne que vous pouvez faire comme ça,

catch (Exception ex) 
     { 
      while(ex.InnerException!=null){ 
       ex=ex.InnerException; 
      } 
      ModelState.AddModelError("", ex.Message); 
     } 

pas trop sûr de la syntaxe :)

Questions connexes