2010-10-15 7 views
1

J'ai quelques questions sur la bonne conception avec EF4 dans un projet ASP.NET MVC 2.Questions de conception re: EF4 et ASP.NET MVC 2

D'abord, la validation. Devrais-je placer ma validation de formulaire dans les événements SavingChanges de mes entités? Comment est-ce que j'obtiendrais les données de forme dans la classe partielle? Ou y a-t-il une meilleure façon de le faire? Deuxièmement, maintenir les utilisateurs connectés. Je viens d'un environnement PHP où il est habituel de transmettre des informations d'utilisateur dans les sessions. Devrais-je le faire avec un objet entité utilisateur? On dirait que c'est trop pour ça.

Répondre

2

j'ai écrit une application dans ASP.NET MVC 1 (.NET 3.5) et utilisé cette "design pattern" pour gérer la validation dans mes modèles:

namespace MyProject.Models { 

    public partial class SomeModel { 

     public bool IsValid { 
      get { return (GetRuleViolations().Count() == 0); } 
     } 

     public IEnumerable<RuleViolation> GetRuleViolations() { 

      SomeModelRepository smr = new SomeModelRepository(); 

      if (String.IsNullOrEmpty(Title)) 
       yield return new RuleViolation("Title required", "Title"); 

      if (String.IsNullOrEmpty(Author)) 
       yield return new RuleViolation("Author required", "Author"); 

      // Add more validation here if needed 

      yield break; 
     } 

     partial void OnValidate(System.Data.Linq.ChangeAction action) 
     { 
      if (!IsValid) 
       throw new ApplicationException("Rule violations prevent saving"); 
     } 
    } 
} 

Cela repose sur une classe nommée RuleViolation:

namespace MyProject.Models 
{ 
    public class RuleViolation 
    { 

     public string ErrorMessage { get; private set; } 
     public string PropertyName { get; private set; } 

     public RuleViolation(string errorMessage) 
     { 
      ErrorMessage = errorMessage; 
     } 

     public RuleViolation(string errorMessage, string propertyName) 
     { 
      ErrorMessage = errorMessage; 
      PropertyName = propertyName; 
     } 

    } 
} 

Dans le contrôleur Créer/Modifier les fonctions POST, je peux vérifier si le modèle validé avec:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(SomeModel somemodel) 
    { 
     if (ModelState.IsValid) 
     { 

      try 
      { 
       somemodel.DateCreated = DateTime.Now; 
       somemodel.DateModified = DateTime.Now; 

       somemodelRepository.Add(somemodel); 
       somemodelRepository.Save(); 

       return RedirectToAction("Index"); 
      } 
      catch 
      { 
       foreach (var issue in chapter.GetRuleViolations()) 
       { 
        // This add the errors to the view so the user knows what went wrong 
        ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage); 
       } 

      } 
     } 

     return View(somemodel); 
    } 

Vous pouvez ensuite utiliser la ligne suivante dans votre point de vue pour afficher toutes les erreurs de validation:

<%= Html.ValidationSummary() %> 

Et aussi mettre cela à côté des champs comme ceci:

<label for="Title">Title:</label> 
<%= Html.TextBox("Title") %> 
<%= Html.ValidationMessage("Title", "*") %> 

Je ne peux pas dire que c'est la meilleure façon de le faire dans MVC 2, mais il a certainement travaillé très bien pour moi dans MVC 1 et continue de travailler dans MVC 2.

en ce qui concerne les sessions utilisateurs vont, vous pouvez les utiliser dans ASP.NET MVC . J'utilise System.Web.Security.FormsAuthentication et FormsAuthenticationTicket pour gérer des choses comme la création de la session, en gardant le nom d'utilisateur stocké dans la session, l'heure d'expiration de la session et quelques autres choses. Une fois la session créée avec cela, vous pouvez stocker des informations supplémentaires dans la session si nécessaire. Je fais cela pour les données dont j'ai besoin sur chaque chargement de page. Si c'est quelque chose de dynamique comme le nombre de messages du forum qui pourraient changer au cours de la session, il suffit de saisir cela de la base de données au besoin.

J'ai trouvé ce bloc de code dans le projet, mais son été pour toujours depuis que je me souviens ce que cela signifie:.

 FormsAuth.SignIn(userName, rememberMe); 
     FormsAuthentication.SetAuthCookie(userName, rememberMe); 
     FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddDays(1), rememberMe, Convert.ToString(somePieceOfDataIAlsoWantedSaved)); 

(I copypasted ce du projet et a changé des noms de variables Il n » t bless à vérifier ma syntaxe et vérifier la documentation pertinente ainsi: p)

+0

C'est exactement la même approche que j'ai conçu en utilisant MVC1 et .NET3.5. Bon à savoir je ne suis pas seul! :) –

+0

Je pense que je pourrais avoir obtenu cela d'un livre ou d'un site Web quelque part, même si je ne me souviens pas. Je sais juste que cela fonctionne bien pour mes besoins, même si cela implique de copier ce code dans chaque modèle. –

+0

Wow, bonnes choses! Merci! –