Question

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. J'aimerais qu'ils soient en mesure de définir le 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 "faux" et ""), Firefox et IE7 rendent l'entrée en lecture seule, ce qui est ennuyeusement contre-intuitif. Existe-t-il un bon moyen, basé sur l'opérateur ternaire, de supprimer complètement l'attribut s'il n'est pas nécessaire?

Était-ce utile?

La solution

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

<%= 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" }

Autres conseils

Si vous souhaitez définir plusieurs attributs et conditionner en lecture seule 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 cela devrait être

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

au lieu de cela dans la réponse leppies.

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

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

$ (fonction () {   $ ("[readonly = 'false']"). removeAttr ("readonly");  });

j'utilise ceci:

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

J'ai essayé la plupart des suggestions ci-dessus et je suis maintenant arrivé au plus simple avec une seule ligne. Combinez 2 objets HTML d'attributs anonymes en déclarant l'un d'eux comme "objet". type.

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top