Atributo condicional Html.TextBox con ASP.NET MVC Preview 5
asp.net-mvc attributes (8)
Tengo MVC View Control fuertemente tipado que es responsable de la interfaz de usuario donde los usuarios pueden crear y editar elementos de clientes. Me gustaría que definan ClientId
en la creación, pero no editen, y esto se refleje en la IU.
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 dé al atributo de solo lectura (incluso "falso" y ""), Firefox e IE7 hacen que la entrada sea de solo lectura, 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?
Difícil problema ... Sin embargo, si quiere definir solo el atributo de solo readonly
, puede hacerlo así:
<%= 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 múltiples copias de los atributos. Por ejemplo, algo como esto (que de todos modos no me gusta):
ClientId.Length > 0
? (object)new { @readonly = "readonly", @class = "myCSS" }
: (object)new { @class = "myCSS" }
Y la alternativa es simplemente emitirlo como simple y antiguo 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" %> />
Creo que debería ser
<%= ((bool) Eval("InRole")) ? "checked" : "" %>
en lugar de esto en la respuesta de los leppies.
<%# ((bool) Eval("InRole")) ? "checked" : "" %>
Al menos no funcionó para mí con # pero funcionó con =. ¿Hice algo mal? Gracias por el consejo de todos modos :)
Si desea definir varios atributos, y solo condicionalmente sin duplicar los otros atributos , puede 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)
Intenté la mayoría de las sugerencias anteriores y ahora he llegado al 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)
Consejo: Es la mera presencia del atributo readonly / disabled 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*/ })
yo uso esto :
@Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object)