2009-10-07 12 views
2

Je cherche un moyen idéal pour que mes formulaires de saisie s'affichent sous forme de zone de texte (modifiable), d'étiquette (en lecture seule) ou de masquée (sans accès) en fonction des rôles . Je sais que je pourrais avoir un point de vue différent pour chaque type de rôle, mais j'espérais qu'il y aurait quelque chose de nouveau qui m'empêcherait de faire 80 points de vue.ASP.NET MVC - Affichage de la valeur de formulaire par rôle

+0

Etes-vous sûr de ne pas rediriger vers des vues différentes dans le contrôleur en fonction de Rôle? Une vue 'edit' devrait rester une vue 'edit'. Sauf si vous recherchez des restrictions d'édition au niveau du champ. – CmdrTallen

Répondre

3

vraiment tout dépend de où vous voulez définir vos méta-données liées à la sécurité. Que veux-tu faire? Décorez vos modèles de vue avec des attributs? Utiliser les classes de méta-buddy Dynamic Data? Configuration fluide ala StructureMap/FluentNhibernate?

Une façon de le faire en utilisant MVC Preview 2 ou le projet InputBuilder de lostechies.com et d'attributs décorations est de passer outre UIHint et de fournir vos propres valeurs UIHint retour aux constructeurs de modèle:

public class RoleUI : UIHintAttribute 
{ 
    public RoleUI(string roles) : base("","") 
    { 
     if(HttpContext.WhereverTheRoleStuffIs == "Admin") 
     //could be Session["CurrentUser"] too 
     { 
      this.UIHint = "Input"; 
     } 

     this.UIHint = "Label"; 
    } 

} 

Ainsi, votre modèle de vue :

public class AwesomeModel 
{ 
    [RoleUI("Admin")] 
    public string FirstName { get; set; } 
} 

Alors maintenant, quand le code va saisir les partials pour vous, il sait si vous souhaitez afficher dans une balise d'entrée ou tout simplement un espace réservé ou lable.

+0

+1 pour mentionner qu'il s'agit vraiment de "où vous voulez mettre vos métadonnées". Parfois, le design est plus sur la façon dont vous voulez être que d'un modèle testé. – Suhas

+1

A partir de MVC4, cela ne fonctionne pas. this.UIHint = "Input" provoque une erreur de compilation. – Ovi

0

Je pense que vous êtes mieux d'avoir une vue en lecture seule et une vue modifiable j'ai peur.

Et la forme d'entrée qui est en lecture seule ne sonne pas bien, à moins que ce soit au niveau du champ lorsque vous êtes sur quelque chose.

0

Vous pouvez avoir un contrôle Html personnalisé qui vérifie le rôle de l'utilisateur et décide ensuite de ce qu'il doit faire.

Je l'ai fait avec ActionLinks, créé Html.ActionLinkSecured

Namespace System.Web.Mvc.Html 
{ 
public static class HtmlHelperExtensions 
{ 
    public static string ActionLinkSecured(this HtmlHelper htmlHelper, string linkText, string action, string controller, object routeValues, bool showDisabled) 
    { 
     //check if user is logged in or whatever you wanna check 
     //if ok 
     return htmlHelper.ActionLink(...); 
     //else 
     return linkText 
    } 
} 

Vous pouvez avoir tout ce que vous voulez ... texte, zone de texte, zone de texte ... :) désactivé

Questions connexes