web-dev-qa-db-fra.com

Attribut conditionnel Html.TextBox avec ASP.NET MVC Preview 5

J'ai un contrôle de vue MVC fortement typé qui est responsable de l'interface utilisateur où les utilisateurs peuvent créer et modifier des éléments client. Je voudrais qu'ils soient capables de définir la ClientId lors de la création, mais pas de l'éditer, et que cela soit reflété dans l'interface utilisateur.

À cette fin, j'ai la ligne suivante:

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, new 
 { @readonly = 
   (ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
      ? "readonly" : "false") 
 } )
%>

Il semble que peu importe la valeur que j'attribue à l'attribut readonly (même "false" et ""), Firefox et IE7 rendent l'entrée en lecture seule, ce qui est ennuyeusement contre-intuitif. Existe-t-il un moyen agréable, basé sur l'opérateur ternaire, de supprimer complètement l'attribut s'il n'est pas requis?

29
tags2k

Problème difficile ... Cependant, si vous voulez définir uniquement l'attribut readonly, vous pouvez le faire comme ceci:

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, 
  ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
    ? new { @readonly =  "readonly" } 
    : null) 
%>

Si vous souhaitez définir plus d'attributs, vous devez définir deux types anonymes et disposer de plusieurs copies des attributs. Par exemple, quelque chose comme ceci (que je n'aime pas quand même):

ClientId.Length > 0 
  ? (object)new { @readonly = "readonly", @class = "myCSS" } 
  : (object)new { @class = "myCSS" }
37
Panos

Si vous souhaitez définir plusieurs attributs et conditionnel readonly sans dupliquer les autres attributs , .__, vous pouvez utiliser Dictionnaire au lieu de types anonymes pour les attributs.

par exemple.

Dictionary<string, object> htmlAttributes = new Dictionary<string, object>();
htmlAttributes.Add("class", "myCSS");
htmlAttributes.Add("data-attr1", "val1");
htmlAttributes.Add("data-attr2", "val2");
if (Model.LoggedInData.IsAdmin == false)
{
    htmlAttributes.Add("readonly", "readonly");
}


@:User: @Html.TextBoxFor(
    m => m.User,
    htmlAttributes)  
26
Aviko

Et l’autre solution consiste simplement à l’émettre sous forme de vieux HTML clair. Oui, l'éditeur vous fera penser que vous avez tort, mais cela semble se produire assez souvent avec VS2008SP1. Cet exemple concerne spécifiquement les cases à cocher qui semblent complètement gâchées dans CTP5, mais il vous donne une idée de la procédure à suivre pour émettre des attributs conditionnels.

<input type="checkbox" name="roles" value='<%# Eval("Name") %>' 
  <%# ((bool) Eval("InRole")) ? "checked" : "" %> 
  <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />
4
leppie

Conseil: C'est la simple présence de l'attribut readonly/disabled qui rend l'élément en lecture seule ou désactivé dans le navigateur.

@Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ })
4
pranavn

Je pense que ça devrait être 

<%= ((bool) Eval("InRole")) ? "checked" : "" %> 

au lieu de cela, leppies répond. 

<%# ((bool) Eval("InRole")) ? "checked" : "" %> 

Au moins, cela n’a pas fonctionné pour moi avec # mais cela a fonctionné avec =. Ai-je fait quelque chose de mal? Merci pour le tuyau quand même :)

1
Olaj
$(function() { $("[readonly='false']").removeAttr("readonly"); });
0
silversumo

j'utilise ceci: 

   @Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object)
0