2009-06-27 9 views
1

Je développe un site Web dans ASP.NET MVC où j'aimerais montrer différentes sections d'une vue pour les utilisateurs avec différents niveaux de sécurité. En substance, les vues sont les mêmes, mais les utilisateurs avec des niveaux de sécurité plus élevés doivent être en mesure de voir les sections qui ne doivent pas être vues par les utilisateurs avec des niveaux de sécurité au-dessus, par exemple, des administrateurs.Comment afficher différentes sections de vue de manière orientée objet

Je ne sais pas comment faire cela d'une manière orientée objet. Je pense que cela peut être fait avec l'héritage, mais je ne sais pas comment implémenter l'héritage dans la vue.

Aussi, je sais que je peux coder un bon nombre d'ifs, de faire quelque chose comme

<% if (User has some security level) { %> 
    <span>show this info</span> 
<% } %> 

mais cela ne sent pas bien. Le fait est que je ne sais pas comment utiliser les principes orientés objet ou la conception pour cette tâche. Je pense que c'est une tâche courante, donc je pense qu'il existe un modèle pour accomplir cette tâche. Par exemple, Stackoverflow le fait quand il montre certaines options (modifier, supprimer, etc.) pour l'utilisateur qui a posté une question (ou une réponse ou un commentaire) et cache les mêmes options à tout le monde.

Répondre

0

Selon la complexité de ce que vous faites, la route d'instruction if peut être suffisante. Si ce n'est pas le cas, vous pouvez utiliser des vues partielles et écrire une extension HtmlHelper qui vous permet de rendre un partiel basé sur un rôle particulier. Il pourrait ressembler à ceci:

<% Html.RenderPartialWithRole("AdminSection", 
           Model, 
           ViewData, 
           User, 
           "Administrator", 
           null) %> 


public static void RenderPartialWithRole(this HtmlHelper helper, 
              string partialName, 
              object model, 
              ViewDataDictionary viewData, 
              IPrincipal user, 
              string role, 
              object htmlAttributes) 
{ 
    if (user != null && !string.IsNullOrEmpty(role) && user.IsInRole(role)) 
    { 
      helper.RenderPartial(partialName, model, viewData, htmlAttributes); 
    } 
} 
0

En utilisant une vue fortement typé, ont une propriété booléenne sur votre modèle comme ShowSection (une pour chaque section, la logique de mettre dans votre controllor). Avoir les sections en divtags avec de bonnes Ids. Utilisez ensuite JavaScript ou jquery pour définir le style d'affichage des balises div en fonction de la propriété Boolean.

+0

C'est pas orienté objet, et si la l'utilisateur a javascript désactivé ne fonctionne pas – eKek0

+0

Je suis d'accord avec eKek0. En outre, je crois fermement que Views ne devrait pas avoir de logique. En d'autres termes, le code intégré dans une vue doit avoir une complexité cyclomatique de 1; c'est-à-dire aucune déclaration "if". –

+0

Je pense que vous êtes trop préoccupé par le faire OO - votre vue devrait être bête et toute la logique soit dans le contrôleur, juste passer les informations nécessaires à travers un modèle –

0

Vous pourriez avoir toutes les sections en partiels, avec des vues construites pour inclure les sections disponibles aux différents niveaux d'autorisation. Donc, un pour les administrateurs, un pour chaque niveau. Ensuite, votre contrôleur a la logique de décider quelle vue utiliser. Donc toute partie OO serait dans le contrôleur, pas la vue.

0

Cette approche n'est pas orientée objet, mais elle est liée. La partie intéressante de cette question est de savoir comment obtenir le tour des if-statements. La méthode habituelle pour se débarrasser de if ou case est d'utiliser une table de recherche de critères et d'effets. Il existe d'autres techniques qui utilisent cette même idée, telles que la programmation orientée données (http://en.wikipedia.org/wiki/Data-directed___programming) et les tables de répartition (http://en.wikipedia.org/wiki/Dispatch_table). De nombreuses implémentations de langage utilisent des tables de répartition de type pour implémenter des appels de méthode virtuelle.

En supposant que les vues partielles sont OK pour ce problème, la table de recherche pourrait être une liste de paires. Le premier élément de la paire est un nom de rôle à vérifier par rapport à l'utilisateur actuel. Le deuxième élément de la paire est le nom de la vue partielle à afficher lorsque la vérification de rôle réussit.

initialisant la table dans le contrôleur (ou whereever) et lui attribuer à ViewData, puis utilisez Html.RenderViewByRole de choisir et de rendre la vue partielle correcte:

<% Html.RenderPartialByRole(User, (List<Dispatch>)ViewData["rolePartial"]); %> 

public static class MyHelper { 
    public static void RenderPartialByRole(this HtmlHelper helper, IPrincipal user, List<Dispatch> rolePartial) { 
     foreach (Dispatch d in rolePartial) { 
      if (d.CheckRole(user)) { 
       helper.RenderPartial(d.PartialName); 
       break; 
      } 
     } 
    } 
} 

public class Dispatch { 
    string _roleName; 
    string _partialName; 

    public Dispatch(string roleName, string partialName) { 
     _roleName = roleName; 
     _partialName = partialName; 
    } 
    public bool CheckRole(IPrincipal user) { 
     return user.IsInRole(_roleName); 
    } 
    public string PartialName { 
     get { return _partialName; } 
    } 
} 

public class HomeController : Controller { 

    List<Dispatch> rolePartial = new List<Dispatch>(); 
    private void InitTable() { 
     rolePartial.Add(new Dispatch("admin", "adminPartial")); 
     rolePartial.Add(new Dispatch("report", "reportPartial")); 
     rolePartial.Add(new Dispatch("guest", "guestPartial")); 
    } 

    public HomeController() { 
     InitTable(); 
    } 

    public ActionResult Index() { 
     ViewData["rolePartial"] = rolePartial; 
     return View(); 
    } 
} 
Questions connexes