Quiero establecer desactivar el atributo basándose en una condición de Html.TextBoxFor en asp.net MVC como el de abajo,

@Html.TextBoxFor(model => model.ExpireDate, new { style = "width: 70px;", maxlength = "10", id = "expire-date" disabled = (Model.ExpireDate == null ? "disable" : "") })

Este consolador tiene dos salida disabled=»disabled» o disabled=»». tanto el tema de hacer el cuadro de texto deshabilitar.

Quiero deshabilitar el cuadro de texto si el Modelo.Opciones expiredate == null más quiero activarlo

11 Comentarios

  1. 80

    La forma válida es:

    disabled="disabled"

    De los navegadores también pueden aceptar disabled="" pero yo recomiendo la primera opción.

    Ahora dicho esto te recomiendo que te la escritura de un código HTML personalizado auxiliar con el fin de encapsular este desactivación de funcionalidad en un reutilizables trozo de código:

    using System;
    using System.Linq.Expressions;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Mvc.Html;
    using System.Web.Routing;
    
    public static class HtmlExtensions
    {
        public static IHtmlString MyTextBoxFor<TModel, TProperty>(
            this HtmlHelper<TModel> htmlHelper, 
            Expression<Func<TModel, TProperty>> expression, 
            object htmlAttributes, 
            bool disabled
        )
        {
            var attributes = new RouteValueDictionary(htmlAttributes);
            if (disabled)
            {
                attributes["disabled"] = "disabled";
            }
            return htmlHelper.TextBoxFor(expression, attributes);
        }
    }

    que se puede utilizar como esto:

    @Html.MyTextBoxFor(
        model => model.ExpireDate, 
        new { 
            style = "width: 70px;", 
            maxlength = "10", 
            id = "expire-date" 
        }, 
        Model.ExpireDate == null
    )

    y que podría traer incluso más inteligencia en este helper:

    public static class HtmlExtensions
    {
        public static IHtmlString MyTextBoxFor<TModel, TProperty>(
            this HtmlHelper<TModel> htmlHelper,
            Expression<Func<TModel, TProperty>> expression,
            object htmlAttributes
        )
        {
            var attributes = new RouteValueDictionary(htmlAttributes);
            var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
            if (metaData.Model == null)
            {
                attributes["disabled"] = "disabled";
            }
            return htmlHelper.TextBoxFor(expression, attributes);
        }
    }

    así que ahora ya no necesita especificar la movilidad condición:

    @Html.MyTextBoxFor(
        model => model.ExpireDate, 
        new { 
            style = "width: 70px;", 
            maxlength = "10", 
            id = "expire-date" 
        }
    )
    • Quiero deshabilitar el cuadro de texto si el Modelo.Opciones expiredate == null más quiero activarlo
    • Farangi, personalizado HTML helper. Ver mis actualizaciones.
    • Esta solución es de gran medida de lo que va… pero sería bueno encontrar una solución limpia que no requiere del establecimiento de una envoltura alrededor de cada HtmlHelper utilizamos que puede tener un atributo disabled (TextBoxFor, TextAreaFor, CheckBoxFor, etc.) Idealmente algo que funciona en línea con los existentes. He construido una solución que, básicamente, sólo envuelve el objeto anónimo y devuelve un RouteValueDictionary – pero no se siente especialmente limpio.
    • «discapacitado», «disabled=»» y «disabled=» discapacitados «» son todos igualmente válidos en html, y es engañosa y falsa) para decir que los más pequeños sólo pueden ser aceptado por los diferentes navegadores. Cf. dev.w3.org/html5/markup/syntax.html#syntax-attr-empty
  2. 40

    De hecho, el comportamiento interno es el proceso de traducir el objeto anónimo a un diccionario.
    Así que lo que hago en estos casos es ir a por un diccionario:

    @{
      var htmlAttributes = new Dictionary<string, object>
      {
        { "class" , "form-control"},
        { "placeholder", "Why?" }        
      };
      if (Model.IsDisabled)
      {
        htmlAttributes.Add("disabled", "disabled");
      }
    }
    @Html.EditorFor(m => m.Description, new { htmlAttributes = htmlAttributes })

    O, como Stephen comentó aquí:

    @Html.EditorFor(m => m.Description,
        Model.IsDisabled ? (object)new { disabled = "disabled" } : (object)new { })
  3. 23

    Me gusta Darin método. Pero forma rápida para solucionar esto,

    Html.TextBox("Expiry", null, new { style = "width: 70px;", maxlength = "10", id = "expire-date", disabled = "disabled" }).ToString().Replace("disabled=\"disabled\"", (1 == 2 ? "" : "disabled=\"disabled\""))
    • Creo que debe rodear esta con @Html.Raw()
  4. 13

    Que lo logra utilizando algunos métodos de extensión

    private const string endFieldPattern = "^(.*?)>";
    
        public static MvcHtmlString IsDisabled(this MvcHtmlString htmlString, bool disabled)
        {
            string rawString = htmlString.ToString();
            if (disabled)
            {
                rawString = Regex.Replace(rawString, endFieldPattern, "$1 disabled=\"disabled\">");
            }
    
            return new MvcHtmlString(rawString);
        }
    
        public static MvcHtmlString IsReadonly(this MvcHtmlString htmlString, bool @readonly)
        {
            string rawString = htmlString.ToString();
            if (@readonly)
            {
                rawString = Regex.Replace(rawString, endFieldPattern, "$1 readonly=\"readonly\">");
            }
    
            return new MvcHtmlString(rawString);
        }

    y, a continuación,….

    @Html.TextBoxFor(model => model.Name, new { @class= "someclass"}).IsDisabled(Model.ExpireDate == null)
    • Esto funcionó mejor para mí.
    • No funciona con CheckBoxFor
    • Funciona si cambio rawstring.Longitud – 2 para el 7 y add «» después de la última «.
    • No funciona con TextAreaFor, necesita una solución para todo tipo de tipos de entrada
  5. 11

    Un enfoque simple que he utilizado es la representación condicional:

    @(Model.ExpireDate == null ? 
      @Html.TextBoxFor(m => m.ExpireDate, new { @disabled = "disabled" }) : 
      @Html.TextBoxFor(m => m.ExpireDate)
    )
  6. 11

    Si no uso los ayudantes html puede usar ternario simple expresión como esta:

    <input name="Field"
           value="@Model.Field" tabindex="0"
           @(Model.IsDisabledField ? "disabled=\"disabled\"" : "")>
    • pero el OP quiere usar ayudante …
  7. 10

    Este es tarde, pero puede ser útil para algunas personas.

    He extendido @DarinDimitrov la respuesta a permitir pasar un segundo objeto que toma cualquier número de boolean atributos html como disabled="disabled" checked="checked", selected="selected" etc.

    Va a hacer que el atributo sólo si el valor de la propiedad es true, cualquier otra cosa y que el atributo no será prestado en todo.

    La costumbre reuseble HtmlHelper:

    public static class HtmlExtensions
    {
        public static IHtmlString MyTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
                                                                    Expression<Func<TModel, TProperty>> expression,
                                                                    object htmlAttributes,
                                                                    object booleanHtmlAttributes)
        {
            var attributes = new RouteValueDictionary(htmlAttributes);
    
            //Reflect over the properties of the newly added booleanHtmlAttributes object
            foreach (var prop in booleanHtmlAttributes.GetType().GetProperties())
            {
                //Find only the properties that are true and inject into the main attributes.
                //and discard the rest.
                if (ValueIsTrue(prop.GetValue(booleanHtmlAttributes, null)))
                {
                    attributes[prop.Name] = prop.Name;
                }                
            }                                
    
            return htmlHelper.TextBoxFor(expression, attributes);
        }
    
        private static bool ValueIsTrue(object obj)
        {
            bool res = false;
            try
            {
                res = Convert.ToBoolean(obj);
            }
            catch (FormatException)
            {
                res = false;
            }
            catch(InvalidCastException)
            {
                res = false;
            }
            return res;
        }
    
    }

    Que se puede utilizar como:

    @Html.MyTextBoxFor(m => Model.Employee.Name
                       , new { @class = "x-large" , placeholder = "Type something…" }
                       , new { disabled = true})
  8. 7

    Es resuelto usando RouteValueDictionary (funciona bien como htmlAttributes, ya que está basado en IDictionary) y un método de extensión:

    public static RouteValueDictionary AddIf(this RouteValueDictionary dict, bool condition, string name, object value)
    {
        if (condition) dict.Add(name, value);
        return dict;
    }

    Uso:

    @Html.TextBoxFor(m => m.GovId, new RouteValueDictionary(new { @class = "form-control" })
    .AddIf(Model.IsEntityFieldsLocked, "disabled", "disabled"))

    De crédito va a https://stackoverflow.com/a/3481969/40939

  9. 5

    si usted no quiere utilizar Html Helpers
    toma, mira mi solución

    disabled="@(your Expression that returns true or false")"

    que

    @{
        bool isManager = (Session["User"] as User).IsManager;
    }
    <textarea rows="4" name="LetterManagerNotes" disabled="@(!isManager)"></textarea>

    y creo que la mejor manera de hacerlo es hacer que comprobar en el controlador y guardarlo en una variable que es accesible dentro de la vista(maquinilla de Afeitar del motor) con el fin de hacer the view free from business logic

    • Si utiliza el atributo disabled en un control, el control será deshabilitado no importa lo que el valor del atributo. Incluso la presencia del atributo sin un valor de deshabilitar el control.
    • Esta solución funciona muy bien, y sospecho que downvoters puede haber pasado por alto que es una expresión booleana. Cuando la expresión es booleano, el atributo disabled se representarán como disabled=»disabled» si la expresión es verdadera, o ser omitido por completo si es falso. Que es exactamente lo que usted desea.
    • Esta bien el render disabled=»false» o disabled=»true», ¿no?
  10. 4

    Sin embargo, otra solución sería crear un Dictionary<string, object> antes de llamar a TextBoxFor y pasar el diccionario. En el diccionario, agregar "disabled" clave sólo si el cuadro de texto es ser discapacitado. No el más bonito, la solución simple y directa.

  11. 2

    Otro enfoque es deshabilitar el cuadro de texto en el lado del cliente.

    En su caso sólo tiene un cuadro de texto que usted necesita para deshabilitar pero consideremos el caso de que usted tiene varias de entrada, seleccione, y campos de área de texto que yout necesario deshabilitar.

    Es mucho más fácil hacerlo a través de jquery + (ya que no se puede confiar en los datos que vienen desde el cliente) agregue un poco de lógica para el controlador, para evitar estos campos de ser salvos.

    Aquí está un ejemplo:

    <input id="document_Status" name="document.Status" type="hidden" value="2" />
    
    $(document).ready(function () {
    
        disableAll();
    }
    
    function disableAll() {
      var status = $('#document_Status').val();
    
      if (status != 0) {
          $("input").attr('disabled', true);
          $("textarea").attr('disabled', true);
          $("select").attr('disabled', true);
      }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here