2013-02-13 2 views
2

J'ai un projet avec beaucoup de grandes vues (formes éditables, pensez à des sortes de sondages). Le client, en phase pilote, vous demande un rôle qui permet de visualiser toutes les formes et tous les éléments, mais ne devrait pas être capable de modifier/enregistrer.Comment rendre un site modifiable par rapport à readonly en fonction des rôles.

Une solution facile serait peut-être de vérifier un rôle et activer/désactiver les boutons de soumission. Mais j'espère qu'il y a un moyen décemment facile de transformer une vue d'editable en readonly sans entrer @readonly de HTML sur chaque élément (il y a bien plus de mille éléments, allant de TextBoxFor, EditorFor à Checkbox et textareas).

Le projet utilise trois rôles: Admin, Centre et Patient. Dans le contrôleur en question, j'ai [Autoriser (Rôles = "Admin, Centre")], mais cela doit probablement aller maintenant (ou j'ai besoin d'ajouter un patient), car ce dernier a besoin d'un readOnly-accès complet.

Des idées sur la façon de fonctionner, sans modifier tous les attributs du modèle et/ou tous les rasoirs?

projet utilise MVC3, rasoir, jquery et jQuery-ui

Répondre

0

Juste pour fermer cette vieille question que je vais vous présenter la façon dont je l'ai résolu.

J'ai dû surcharger "TextBoxFor", "CheckBoxFor" (etc.), en ajoutant un paramètre booléen pour readOnly/disabled à la fin des méthodes. Exmaple ci-dessous:

//Overload TextBoxFor with a "disabled" parameter. For use with readonly-roles 
    public static IHtmlString TextBoxForRo<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled) 
    { 
     var attributes = new RouteValueDictionary(); 

     if (htmlAttributes != null) 
     { 
      foreach (System.ComponentModel.PropertyDescriptor property in System.ComponentModel.TypeDescriptor.GetProperties(htmlAttributes)) 
      { 
       attributes.Add(property.Name.Replace('_', '-'), property.GetValue(htmlAttributes)); 
      } 
     } 

     if (disabled) 
     { 
      attributes["disabled"] = "disabled"; 
     } 
     return htmlHelper.TextBoxFor(expression, attributes); 
    } 

je devais le faire pour tous les types ou sous forme d'entrée, et il est évident que je devais remplacer un grand nombre d'appels dans la vue. Cela fonctionne bien et c'était la meilleure solution que je pouvais imaginer.

Questions connexes