asp.net mvc 3 - MVC3 deshabilita condicionalmente Html.TextBoxFor()
asp.net-mvc-3 conditional (5)
Este es el método que uso, que no requiere extensiones, y no lo limita a un solo atributo de HTML. Asume que hay una propiedad booleana llamada "Desactivado" en su modelo, pero puede poner lo que desee allí, siempre que se evalúe como booleano para el operador ternario:
@Html.TextBoxFor(model => model.Whatever,
new Dictionary<string, object>() {
{ "size", "5" },
{ "class", "someclasshere" },
{ model.Disabled ? "disabled" : "data-notdisabled", "disabled" }
})
La limitación con la notación abreviada estándar es que el nombre del atributo no puede ser dinámico. Al crear un diccionario del tipo correcto, puede hacer que el nombre del atributo sea dinámico, y luego pasar ese diccionario al cuadro de texto como el diccionario de atributos. Cuando no se debe deshabilitar el campo, pasa un atributo llamado "datos no desactivados" en lugar de uno llamado "deshabilitado", que el navegador ignorará.
Tengo una aplicación web de C # .Net. En esa aplicación, necesito deshabilitar condicionalmente los controles Html.TextBoxFor
(también controles Html.DropDownListFor
) en función de quién está conectado al sistema. Intenté usar
@Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.IsDisabled })
Donde @ViewBag.IsDisabled
se establece en String.Empty o "disabled" en el Controller. Sin embargo, esto se interpreta como IsDisabled=''disabled''
o IsDisabled=""
por lo que el control no está deshabilitado. Cuando lo intenté
@Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.Disabled })
El control siempre estaba deshabilitado incluso si ViewBag.Disabled
no contenía texto. ¿Cómo puedo deshabilitar condicionalmente los controles Html.TextBoxFor()
?
Extendiendo la respuesta de @ James, escribí esta extensión HtmlHelper que actualiza / elimina el atributo disabled
si ya está presente, o lo agrega si no:
public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled) {
string html = helper.ToString();
var regex = new Regex("(disabled(?:=/".*/")?)");
if (regex.IsMatch(html)) {
html = regex.Replace(html, disabled ? "disabled=/"disabled/"" : "", 1);
} else {
regex = new Regex(@"(//?>)");
html = regex.Replace(html, disabled ? "disabled=/"disabled/"$1" : "$1", 1);
}
return MvcHtmlString.Create(html);
}
También funciona muy bien con etiquetas de cierre automático (como <input />
).
El uso es el mismo:
@Html.TextBoxFor(model => model.PropertyName).Disable(true)
Probado en @Html.DropDownListFor()
y @Html.TextBoxFor()
.
La solución publicada por @epignosisx funciona, pero puede ser un problema si desea agregar algún otro atributo porque tendrá que agregarlo a ambos objetos (el que está disabled
y el que ahora está vacío).
Peor aún si tiene alguna otra propiedad de bool porque tendrá cuatro objetos diferentes, cada uno para cada combinación.
La mejor solución aquí (con un poco más de código) es construir un método de extensión para HtmlHelper para recibir su propiedad booleana como parámetro.
public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, object htmlAttributes = null)
{
return TextBoxDisabledFor(htmlHelper, expression, disabled, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
}
public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, IDictionary<string, object> htmlAttributes)
{
if (htmlAttributes == null)
htmlAttributes = new Dictionary<string, object>();
if (disabled)
htmlAttributes["disabled"] = "disabled";
return htmlHelper.TextBoxFor(expression, htmlAttributes);
}
Aquí hay otro ejemplo
Tratar
@Html.TextBoxFor(model => model.ProposalName, ViewBag.Disabled ? (object)new { disabled="disabled" } : new {})
Tuve el mismo problema y decidí escribir mi propio método de extensión HtmlHelper
.
public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled)
{
if (helper == null)
throw new ArgumentNullException();
if (disabled)
{
string html = helper.ToString();
int startIndex = html.IndexOf(''>'');
html = html.Insert(startIndex, " disabled=/"disabled/"");
return MvcHtmlString.Create(html);
}
return helper;
}
Esto aceptará un valor booleano para indicar si el control debe estar deshabilitado o no. Simplemente agrega disabled="disabled"
dentro del primero >
aparece en una cadena.
Puedes usarlo como a continuación.
@Html.TextBoxFor(model => model.ProposalName).Disable(true)