2010-04-26 3 views
1

Je commence juste à apprendre asp.net mvc et je ne suis pas sûr de ce que la bonne chose à faire est.Dois-je avoir différents modèles et vues pour aucune donnée utilisateur que pour certaines données utilisateur?

J'ai un utilisateur et un utilisateur a une collection de (0 ou plusieurs) rappels. J'ai un contrôleur pour l'utilisateur qui obtient les rappels pour l'utilisateur actuellement connecté d'un service de rappel. Il remplit un modèle qui contient des informations sur l'utilisateur et la collection de rappels.

Ma question est de devrais-je avoir 2 vues différentes, une pour quand il n'y a pas de rappels et une pour quand il y a des rappels? Ou devrais-je avoir une vue qui vérifie le nombre de rappels et affiche des choses différentes? Avoir une vue semble faux alors que je me retrouve avec du code à mon avis qui dit if (Model.Reminders.Count==0){//do something} else {do something else}, et avoir une logique dans la vue se sent mal. Mais si je veux avoir 2 vues différentes alors je voudrais avoir un code comme celui-ci dans mon contrôleur:

[Authorize] 
public ActionResult Index() 
{ 
    MembershipUser currentUser = m_membershipService.GetUser(); 
    IList<Reminder> reminders = m_reminderRepository.GetReminders(currentUser); 
    if (reminders.Count == 0) 
    { 
     var model = new EmptyReminderModel 
     { 
      Email = currentUser.Email, 
      UserName = currentUser.UserName 
     }; 
     return View(model); 
    } 
    else 
    { 
     var model = new ReminderModel 
         { 
          Email = currentUser.Email, 
          UserName = currentUser.UserName, 
          Reminders = reminders 
         }; 
     return View(model); 
    } 

mais évidemment cela ne compile pas que la vue ne peut pas prendre les deux types différents. Donc, si je vais faire si je retourne une vue spécifique du nom de mon contrôleur, selon le vide des rappels, ou si ma méthode Index() rediriger vers d'autres actions comme ceci:

[Authorize] 
public ActionResult Index() 
{ 
    MembershipUser currentUser = m_membershipService.GetUser(); 
    IList<Reminder> reminders = m_reminderRepository.GetReminders(currentUser); 
    if (reminders.Count == 0) 
    { 
     return RedirectToAction("ShowEmptyReminders"); 
    } 
    else 
    { 
     return RedirectToAction("ShowReminders"); 
    }    
} 

qui semble plus agréable mais j'ai besoin de re-interroger les rappels pour l'utilisateur actuel dans l'action ShowReminders.

Ou devrais-je faire autre chose entièrement?

Répondre

2

Pour une complexité mineure comme celle-là, je ne trouve pas de problème avec un bloc '<% if .. else%>' dans la vue. Cependant, si vous avez envie d'aller vraiment loin ...

Une réponse possible serait d'utiliser DisplayTemplates. Si vous avez un UserBaseViewModel de base, puis votre UserWithRemindersViewModel et UserWithoutRemindersViewModel héritent de UserBaseViewModel, vous pouvez passer le UserBaseViewModel comme type générique pour votre affichage, aka System.Web.Mvc.ViewPage <UserBaseViewModel>. Puis, en fonction de votre logique dans le contrôleur, vous renvoyez un UserWithRemindersViewModel ou l'autre à la vue. (alias return View (new UserWithoutRemindersViewModel()) // Hérite UserBaseViewModel, donc tout va bien!)

Ensuite, vous pouvez simplement appeler le Html.DisplayFor (m => m) sur votre vue.

Si vous créez deux modèles dans les \ Vues \ <ControllerName> \ DisplayTemplates \, UserWithRemindersViewModel.ascx et UserWithoutRemindersViewModel.ascx. MVC sélectionnera le bon modèle d'affichage pour le type de votre modèle que vous avez transmis, et puisque chacune de ces vues partielles sera fortement typée au type de modèle de vue correct, il n'y a pas besoin de <% if ... else%> pour afficher le bon HTML.

+0

Je vous entends parler de la complexité mineure, mais comme mon but est d'apprendre, je veux quelque chose de simple mais je veux «faire les choses comme il faut» pour que votre suggestion soit idéale. Je vais jouer avec ça et voir où ça me mène. Jamais utilisé le Html.DisplayFor, donc quelque chose d'autre à jouer avec. Merci. –

Questions connexes