Pregunta

Tengo un MVC View Control fuertemente tipado que es responsable de la interfaz de usuario donde los usuarios pueden crear y editar los elementos del Cliente. Me gustaría que pudieran definir el ClientId en la creación, pero no editar, y esto se reflejará en la interfaz de usuario.

Para este fin, tengo la siguiente línea:

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

Parece que no importa qué valor le doy al atributo de solo lectura (incluso "falso" y "y"), Firefox e IE7 hacen que la entrada sea de solo lectura, lo que es molesto contra la intuición. ¿Existe una forma agradable, basada en el operador ternario, de eliminar completamente el atributo si no es necesario?

¿Fue útil?

Solución

Problema difícil ... Sin embargo, si desea definir solo el atributo readonly , puede hacerlo de la siguiente manera:

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

Si desea definir más atributos, debe definir dos tipos anónimos y tener varias copias de los atributos. Por ejemplo, algo como esto (que no me gusta de todos modos):

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

Otros consejos

Si desea definir varios atributos, y condicional solo lectura sin duplicar los otros atributos , puede usar el Diccionario en lugar de tipos anónimos para los atributos.

por ejemplo

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)  

Y la alternativa es simplemente emitirlo como HTML antiguo. Sí, el editor te hará pensar que estás equivocado, pero eso parece ocurrir con bastante frecuencia con VS2008SP1. Este ejemplo es específicamente para casillas de verificación que parecen estar completamente desperdiciadas en CTP5, pero le da una idea de cómo emitir atributos condicionales.

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

Consejo: es la mera presencia de atributo de solo lectura / deshabilitado que hace que el elemento sea de solo lectura o deshabilitado en el navegador.

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

Creo que debería ser

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

en lugar de esto en leppies respuesta.

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

Al menos no me funcionó con # pero funcionó con =. ¿Hice algo mal? Gracias por el consejo de todos modos :)

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

uso esto:

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

Probé la mayoría de las sugerencias anteriores y ahora he llegado a lo más simple con una sola línea. Combine 2 objetos de atributos html anónimos mediante la declaración de uno de ellos como " objeto " tipo.

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top