Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC3 Conditionally disable Html.TextBoxFor()

I have a C# .Net web app. In that app I need to conditionally disable Html.TextBoxFor controls (also Html.DropDownListFor controls) based on who is logged into the system. I tried using

 @Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.IsDisabled })

Where @ViewBag.IsDisabled is set to either String.Empty or "disabled" in the Controller. However, this renders as IsDisabled='disabled' or IsDisabled="" so the control is not disabled. When I tried

@Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.Disabled })

The control was always disabled even if ViewBag.Disabled contained no text. How can I conditionally disable the Html.TextBoxFor() controls?

like image 598
MikeTWebb Avatar asked Jan 31 '12 20:01

MikeTWebb


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.

What is the difference between HTML TextBox HTML TextBoxFor and HTML EditorFor?

Show activity on this post. TextBoxFor: It will render like text input html element corresponding to specified expression. In simple word it will always render like an input textbox irrespective datatype of the property which is getting bind with the control. EditorFor: This control is bit smart.

How do you make a TextBoxFor ReadOnly?

The TextBoxes can be made ReadOnly by setting the HTML ReadOnly attribute using the HtmlAttributes parameter in Html. TextBox and Html. TextBoxFor helper functions.


Video Answer


3 Answers

The solution posted by @epignosisx works, but it may be a problem if you want to add some other attribute because you will have to add it it both objects (the one with disabled and the one now its empty).

Even worse if you have some other bool property because you will have four different objects, each one for each combination.

The best solution here (with a little more code) is to build an extension method for HtmlHelper to receive your boolean property as a parameter.

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

Here there is another example

like image 36
Diego Avatar answered Oct 04 '22 05:10

Diego


Try

@Html.TextBoxFor(model => model.ProposalName, ViewBag.Disabled ? (object)new { disabled="disabled" } : new {}) 
like image 110
epignosisx Avatar answered Oct 04 '22 05:10

epignosisx


I had this same problem and decided to write my own HtmlHelper extension method.

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

This will accept a boolean to indicate if the control should be disabled or not. It just appends disabled="disabled" just inside the first > it comes across in a string.

You can use it like below.

@Html.TextBoxFor(model => model.ProposalName).Disable(true)

like image 44
James Avatar answered Oct 04 '22 06:10

James