Tengo un inflexible MVC Control de Vista de que es responsable de la interfaz de usuario donde los usuarios pueden crear y editar los elementos del Cliente. Me gustaría ser capaz de definir el ClientId sobre la creación, pero no editar, y que esto se refleje 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 el atributo readonly (incluso «falso» y «»), Firefox e IE7 haga la entrada de sólo lectura, lo cual es molesto contra-intuitivo. Hay un agradable, ternario-basado en el operador de soltar el atributo completamente si no es necesario?

InformationsquelleAutor tags2k | 2008-10-07

8 Comentarios

  1. 37

    Problema difícil… sin Embargo, si desea definir sólo el readonly atributo, puede hacerlo así:

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

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

    ClientId.Length > 0 
      ? (object)new { @readonly = "readonly", @class = "myCSS" } 
      : (object)new { @class = "myCSS" }
    • +1 Mi primer tiro fue el segundo fragmento de código sin el yeso a objeto. Su fácil de pasar por alto, pero realmente es necesario.
  2. 27

    Si quieres definir varios atributos, y condicional readonly sin duplicar los otros atributos,
    usted puede utilizar 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)  
    • Debe ser la respuesta, ya que se evita la repetición.
  3. 4

    Y la alternativa es sólo para emitir en formato HTML antiguo. Sí, el editor va a hacer que usted piensa que está mal, pero que parece ocurrir con bastante frecuencia con VS2008SP1. Este ejemplo es específicamente para las casillas de verificación que parece estar completamente perdido en CTP5, pero te da una idea de cómo emiten condicional atributos.

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

    Sugerencia: se trata de la mera presencia de sólo lectura/atributo disabled que hace que el elemento readonly o desactivado en el navegador.

    @Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ })
    • ¿por qué la clase anónima necesidad de ser echado a objeto para la primera condición de la ternario op? No es difícil, sólo tratando de entenderlo. Gracias!
  5. 1

    Creo que debería ser

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

    lugar de este en leppies respuesta.

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

    Al menos no me funciona con # pero se trabajó con =. ¿Hice algo mal? Gracias por la sugerencia de todas formas 🙂

  6. 0

    yo uso este :

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

    He probado la mayoría de las sugerencias anteriores y ahora he llegado a la más simple con una sola línea. Combine 2 anónimo atributos html objeto de declarar marchitan uno de como «objeto» de tipo.

    @Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)
    • Esto no funciona para mí; @readonly = false todavía se interpreta como readonly

Dejar respuesta

Please enter your comment!
Please enter your name here