Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set disable attribute based on a condition for Html.TextBoxFor

I want to set disable attribute based on a condition for Html.TextBoxFor in asp.net MVC like below

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

This helper has two output disabled="disabled " or disabled="". both of theme make the textbox disable.

I want to disable the textbox if Model.ExpireDate == null else I want to enable it

like image 338
Ghooti Farangi Avatar asked Jul 12 '11 06:07

Ghooti Farangi


People also ask

How disable HTML TextBoxFor in MVC?

You can make the input 'read only' by using 'readonly'. This will let the data be POSTED back, but the user cannot edit the information in the traditional fashion. Keep in mind that people can use a tool like Firebug or Dragonfly to edit the data and post it back.

How do I use TextBoxFor in HTML?

The HtmlHelper class includes two extension methods TextBox() and TextBoxFor<TModel, TProperty>() that renders the HTML textbox control <input type="text"> in the razor view. It is recommended to use the generic TextBoxFor<TModel, TProperty>() method, which is less error prons and performs fast.

What is the difference between EditorFor and TextBoxFor?

TextBoxFor will always show the textbox element no matter which kind of property we are binding it with. But EditorFor is much flexible in this case as it decides which element will be more suitable to show the property.


1 Answers

The valid way is:

disabled="disabled" 

Browsers also might accept disabled="" but I would recommend you the first approach.

Now this being said I would recommend you writing a custom HTML helper in order to encapsulate this disabling functionality into a reusable piece of code:

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);     } } 

which you could use like this:

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

and you could bring even more intelligence into this 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);     } } 

so that now you no longer need to specify the disabled condition:

@Html.MyTextBoxFor(     model => model.ExpireDate,      new {          style = "width: 70px;",          maxlength = "10",          id = "expire-date"      } ) 
like image 168
Darin Dimitrov Avatar answered Sep 21 '22 00:09

Darin Dimitrov