74 votes

MVC 3: Ajout conditionnel de l'attribut désactivé avec les HtmlHelpers

J'ai un ASP.Net MVC 3 application web et je suis l'ajout d'une case à cocher pour afficher la page à l'aide de la classe HtmlHelper, comme ça...

@Html.CheckBox("CheckBox1", true, new { @class = "Class1" })

Ce que je veux faire est conditionnellement ajouter les handicapés attribut basé sur une vue de l'état de la propriété. Fondamentalement, le suivant serait l'idéal...

@Html.CheckBox("CheckBox1", true, new { @class = "Class1", @disabled = Model.ReadOnly })

Malheureusement, en raison de la nature de l'désactivé attribut, cela ne fonctionnera pas, car toute valeur attribuée aux personnes à mobilité réduite attribut (même les "faux") sera traduit comme vrai.

J'ai déjà pensé à quelques solutions pour contourner ce problème, donc la question n'est pas comment le faire. Mais plutôt, est-il une manière simple comme la méthode souhaitée ci-dessus? ou dois-je avoir recours à l'une des opérations suivantes?..

Ce que je sais que je pourrais faire...

  1. Créer un if/else et écrire à différents Html.CheckBox des lignes (pas génial pour des raisons de lisibilité - et possible avec un jet de mark-up d'avertissement - ne sais pas)

  2. Sautez la classe HtmlHelper et écrire à la main la balise permettant de mieux conditionnellement attributs (qui garde le code plus court, mais ajoute l'incohérence)

  3. Créer un helper personnalisé qui prend "personnes handicapées" du paramètre (la solution la plus propre, mais nécessite indésirables méthodes supplémentaires - sans doute la meilleure option si loin tout de même)

55voto

BigMike Points 3443

Définissez ceci quelque part dans votre vue / assistants

 @functions {
 object getHtmlAttributes (bool ReadOnly, string CssClass) 
 {
     if (ReadOnly) {
         return new { @class = CssClass, @readonly = "readonly" };
     }
     return new { @class = CssClass };
 }
}
 

Alors utilisez:

 @Html.TextBox("name", "value", @getHtmlAttributes(Model.ReadOnly, "test"))
 

33voto

Mir Points 361

Voici ma réponse de cette question similaire: http://stackoverflow.com/a/13922813/495000


J'ai créé le Helper - il prend une valeur de type boolean et un objet anonyme. Si désactivé est vrai, il ajoute les personnes handicapées de l'attribut de l'objet anonyme (qui est en fait un Dictionnaire) avec la valeur "désactivé", sinon il ne pas ajouter de la propriété.

public static RouteValueDictionary ConditionalDisable(
   bool disabled, 
   object htmlAttributes = null)
{
   var dictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

   if (disabled)
      dictionary.Add("disabled", "disabled");

   return dictionary;
}

Un exemple en action:

@Html.TextBoxFor(m => m.SomeProperty,    
   HtmlHelpers.ConditionalDisable(true, new { @class = "someClass"))

Un énorme avantage de cette approche pour moi est que cela fonctionne avec pratiquement tous les MVC HtmlHelpers car ils ont tous les Surcharges qui acceptent une RouteValueDictionary au lieu d'un objet anonyme.

Mises en garde:
HtmlHelper.AnonymousObjectToHtmlAttributes() utilise un peu de fantaisie code ninja de travail pour faire avancer les choses. Je ne suis pas entièrement sûr de savoir comment performant, il est... mais c'est suffisant pour ce que je l'utilise pour. Votre kilométrage peut varier.

Je n'en ai pas en particulier, comme le nom de l'il - mais je ne pouvais pas trouver quelque chose de mieux. Changement de nom n'est facile.

Je n'aime pas la syntaxe d'utilisation - mais encore une fois je ne pouvais pas trouver quelque chose de mieux. Il ne devrait pas être difficile à changer. Une extension de la méthode sur l'objet est une idée... tu ferais à la fin avec l' new { @class = "someClass" }.ConditionalDisable(true) mais alors, si vous ne voulez désactiver l'attribut et n'ont rien d'autre à ajouter, vous vous retrouvez avec quelque chose de brut, comme new {}.ConditionalDisable(true); et vous retrouver avec une méthode d'extension qui se présente pour tous les object... ce qui n'est probablement pas souhaitable.

14voto

Andy Brudtkuhl Points 1714

Si vous voulez une syntaxe plus succincte sans nécessiter de fonction d'assistance, vous pouvez utiliser une instruction ternaire lors de la définition du dictionnaire utilisé pour les attributs HTML de l'aide @ HTML.Checkbox ...

 @Html.CheckBox("CheckBox1", true, Model.ReadOnly 
       ? new { @class = "Class1", @disabled = Model.ReadOnly } 
       : null)
 

Dans ce cas, Model.ReadOnly est false, null est transmis en tant que dictionnaire d'attributs HTML.

3voto

grx Points 2096

L'ajout de l'attribut désactivé côté client fonctionne pour moi. Notez que vous devez vérifier quels champs sont autorisés à être modifiés côté serveur, mais c'est également le cas lorsque l'attribut désactivé est déclaré de manière décorative.

Dans cet exemple, j'ai désactivé tous les enfants d'un formulaire à l'aide de jQuery.

     if (Model.CanEdit)
    {
        <script type="text/javascript">

            $(document).ready(function() {

                $('#editForm *').attr('disabled', true);
            });

        </script>
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X