Checkbox disabled attribute in ASP.NET MVC
It is not easy to achieve this with an if
condition inside the helper method because all the below markups will render a disabled chechbox.
<input type="checkbox" disabled>
<input type="checkbox" disabled="disabled">
<input type="checkbox" disabled="false">
<input type="checkbox" disabled="no">
<input type="checkbox" disabled="enabled">
This should work in the razor. Simple If condition and rendering what you want.
@if(item.Selected)
{
@Html.CheckBoxFor(modelItem => item.Selected)
}
else
{
@Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = "disabled"})
}
You may consider writing a custom html helper which renders the proper markup for this.
The problem is when you have to add more than 1 HTML attribute. That's a mess:
@if(item.Selected)
{
@Html.CheckBoxFor(modelItem => item.Selected, new { @data_foo = "bar"})
}
else
{
@Html.CheckBoxFor(modelItem => item.Selected, new { @data_foo = "bar", @disabled = "disabled"})
}
What I do to solve this is to use a IDictionary<string, object>
that is previously loaded:
var htmlAttributes = new Dictionary<string, object>{
{"data-foo", "bar"}
};
if(!item.Selected)
{
htmlAttributes.Add("disabled", "disabled");
}
And then I create the checkbox component only once:
@Html.CheckBoxFor(modelItem => item.Selected, htmlAttributes)
This won't work because <input disabled="anything" />
will result in a disabled control. You need to only have a @disabled property when it should be disabled.
Try something like this:
@Html.CheckBoxFor(modelItem => item.Selected, item.Selectable ? (object)new {} : (object)new { @disabled = "disabled" })
Note that you might need to cast to (object)