2010-03-29 10 views
0

J'ai une application asp.net mvc 2. Je dois afficher la même page pour chaque utilisateur. Mais chaque utilisateur a des droits différents sur les données. IE certains peuvent voir mais ne pas éditer certaines données, certains ne peuvent pas éditer ni voir les données. Idéalement, les données qui ne peuvent être ni vues ni modifiées sont des espaces sur la vue. Pour des raisons de sécurité, je souhaite que mes viewmodels soient aussi rares que possible. Je veux dire par là que si un champ ne peut pas être vu ou édité, ce champ ne devrait pas être sur le viewmodel. Évidemment, je peux écrire une vue pour chaque modèle de vue, mais cela semble inutile. Alors, voici mon idée/wishlistVues dynamiques basées sur les modèles de vue

Puis-je décorer le viewmodel avec des attributs et accrocher dans un événement de pré-rendu des aides html et lui dire de faire plutôt   ??? Puis-je demander aux helpers html de sortir   pour les entrées introuvables sur le viewmodel?

ou

je peux transformer facilement une vue intégrée dans le code puis construire programaticlly le balisage, puis mis dans le à traiter et viewd comme html côté client moteur de rendu ??

Répondre

0

De la façon dont vous avez formulé la question, je crains que toute réponse aboutisse à une vue assez complexe. Décider quelle vue afficher (et quel modèle de vue à construire) dépend des rôles de l'utilisateur est la responsabilité du contrôleur.

EDIT 1: Réponse au commentaire

Pouvez-vous faire quelque chose comme ça?

<% if (Model.AllowEdit) { %> 
    <%= Html.TextBoxFor(x => x.SomeProperty); %> 
<% } else if (Model.AllowView) { %> 
    <%= Html.Encode(Model.SomeProperty) %> 
<% } else { %> 
    <span>You may not view this property.</span> 
<% } %> 

Cela pourrait se traduire par un contrôle d'assistance.

public static ExtensionsOfHtmlHelper 
{ 
    public static MvcHtmlString DynamicTextBox(this HtmlHelper html, Func<TModel, object> lambda, bool edit, bool view) 
    { 
     if (edit) 
     { 
      return html.TextBoxFor(lambda); 
     } 
     else if (view) 
     { 
      return html.LabelFor(lambda); 
     } 
     else 
     { 
      return MvcHtmlString.Create("<span>You may not view this value.</span>"); 
     } 
    } 
} 

Alors, selon vous,

<%= Html.DynamicTextBox(x => x.SomeProperty, Model.AllowEdit, Model.AllowView) %> 

Quelque chose proche-ish qui devrait fonctionner.

+0

droit mais je veux une vue avec de nombreux viewmodels. Et une façon de le faire intelligemment. sinon, il fabrique de nombreuses vues. peut non seulement créer un modèle de vue mais une vue pour cela. ils sont trop étroitement couplés. Je veux que mon point de vue soit façonné par le viewmodel et en dépende. et certainement pas l'inverse – Joe

+0

@Joe, voir la réponse éditée –

+0

Ouais j'y pensais un peu plus. Peut-être que je pourrais a) créer des rôles que je ne décorerai pas sur les fonctions du contrôleur b) mettre ces rôles dans les attributs sur les vues c) les assistants vérifient le rôle actuel et si ne correspondent pas alors ne rien afficher et effacer le champ d'information ces attributs sur les champs dans le viewmodel serait [CanViewOnly (Roles = "aRole")] [NoView (Rôles = "anotherRole")] – Joe