2008-10-07 9 views
27

Tengo un MVC View Control fuertemente tipado que es responsable de la interfaz de usuario donde los usuarios pueden crear y editar elementos del cliente. Me gustaría que sean capaces de definir el ClientId en la creación, pero no editar, y esto se reflejará en la interfaz de usuario.Html.TextBox atributo condicional con ASP.NET MVC Vista previa 5

Con 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 de sólo lectura (incluso "falsa" y ""), Firefox e IE7 hacen que la entrada de leer -solo, lo cual es molestamente contra-intuitivo. ¿Hay alguna manera agradable, basada en el operador ternario, de soltar el atributo por completo si no se requiere?

Respuesta

35

Tough problema ... Sin embargo, si se quiere definir sólo el atributo readonly, puede hacerlo de esta 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 a continuación, debe definir dos tipos anónimos y tener copias múltiples 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" } 
+0

+1 Mi primer disparo fue el segundo fragmento de código sin el elenco de oponerse.Se pasa por alto fácilmente pero realmente necesario. –

4

Y alternativa es sólo para emitirla como el viejo y simple de HTML. Sí, el editor te hará pensar que estás equivocado, pero parece suceder 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" %> /> 
1

creo que debe ser

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

en lugar de esto en leppies responder.

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

Al menos no funcionó para mí con # pero funcionó con =. ¿Hice algo mal? Gracias por la punta de todos modos :)

0
$ (function() {$ (" [sólo lectura = 'false']") removeAttr ("sólo lectura");. });
21

Si desea definir varios atributos, y condicional de sólo lectura sin duplicar los otros atributos, podrá usar el diccionario en lugar de los tipos anónimos para los atributos.

p. Ej.

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) 
+1

debería ser la respuesta porque evita la repetición. –

-2

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

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object) 
+0

Esto no funciona para mí; '@readonly = false' se sigue interpretando como' readonly' –

2

Consejo: Es la mera presencia de atributo de sólo lectura/desactivado que hace que el elemento de sólo lectura o desactivado en el navegador.

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

¿por qué la clase anónima debe emitirse para objetar la primera condición de la operación ternaria? No desafiarlo, solo tratar de entenderlo. ¡Gracias! – eaglei22

0

utilizo este:

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