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?
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" }
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)
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" %> />
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*/ })
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 :)
j'utilise ceci:
@Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object)