Condition of html helper not working - asp.net-mvc

I want the disabled attribute be added to a textbox based on a condition
#Html.TextBoxFor(m => m.kidsNumber, new { (Model.kidsDropDown != "2") ? "#disabled" : ""})

Use
#Html.TextBoxFor(m => m.kidsNumber, Model.kidsDropDown != "2" ? new {disabled = "disabled"} : null )
Note also if you need to add multiple attributes, then it needs to be in the format (where the attributes are cast to object
#Html.TextBoxFor(m => m.kidsNumber, Model.kidsDropDown != "2" ? (object)new { #disabled = "disabled", #class="form-control" } : (object)new { #class="form-control" })
If you have multiple textboxes that use the same sets of attributes, you can assign these to variables in the view
#{
object number = new { #type = "number", #class="form-control" };
object disabledNumber = new { #disabled = "disabled", #class="form-control" };
}
and in the form
#Html.TextBoxFor(m => m.kidsNumber, Model.kidsDropDown != "2" ? disabledNumber : number)
#Html.TextBoxFor(m => m.anotherProperty, AnotherCondition ? disabledNumber : number)
.....

You have not said which attribute you want to set ::
you code is without attribute and you should use
use readonly instead because disabled fields are not posted on form submit
#Html.TextBoxFor(m => m.kidsNumber, new { (Model.kidsDropDown != "2") ? "#disabled" : ""})
For Disabled attribute Use::
#Html.TextBoxFor(m => m.kidsNumber, Model.kidsDropDown != "2" ? new {disabled = "disabled"} : null )
For readonly Use something like::
#Html.TextBoxFor(m => m.kidsNumber, new { #readonly= (Model.kidsDropDown != "2" ? "readonly" : "")})

Related

disable Html.DropDownListFor

I have the below code in CSHTML but seems like the dropdown is not getting disabled
#Html.DropDownListFor(x => x.Task_Status_Code, Model.TaskStatus, new { #class = "form-control", #disabled = "disabled" })
I want to disable it but it is not working.
#Html.DropDownListFor(
x => x.Task_Status_Code,
Model.TaskStatus,
new { #class = "form-control", disabled = "disabled" })
Removed the # sign before the disabled property name.
You need to add the # character before any dotnet keywords like class. Custom properties do not need to have # prefix.
Please check with below snippet !
#Html.DropDownListFor(
x => x.ReminderTime,
Model.RemindersList,
new { disabled = "disabled" }
)
#Html.DropDownListFor(x => x.Task_Status_Code, Model.TaskStatus, new { disabled = "disabled" })
That will work as well unless you define css form control with in then
#Html.DropDownListFor(x => x.Task_Status_Code, Model.TaskStatus, new { #class="form-control", disabled = "disabled" })
Remember not to put #sign before disabled

MVC 5 checking RadioButtonFor based on model

I have a problem for which I just can't find a solution.
Checking button like this works:
#Html.RadioButtonFor(x => x.an2[0], 3, Model.an2[0]==3
? new { id = "B", #checked = "checked" } : null)
But I also need to set id, how do I do that? This code:
#Html.RadioButtonFor(x => x.an2[0], 3, Model.an2[0]==3
? new { id = "B", #checked = "checked" } : new { id = "B" })
Gives error:
Type of conditional expression cannot be determined because there is no implicit conversion between 'AnonymousType#1' and 'AnonymousType#2'
Which is beyond my understanding.
I suppose there should be a trivial solution to this?
Cast them to object:
Html.RadioButtonFor(x => x.an2[0], 3, Model.an2[0]==3
? (object)new { id = "B", #checked = "checked" } : (object)new { id = "B" });
Check this link.
#{string id = ViewData.TemplateInfo.GetFullHtmlFieldId("radioTrue");}
#Html.RadioButtonFor(x => x.an2[0], 3, Model.an2[0]==3 ? new { id } : null)
A good example of this is here.

Adding a default value to selected list Razor

I am populating a dropdown like this
primaryDrop = new Dictionary<string, string>()
{
{"1", "Getting ready"},
{"2", "Starting"},
{"3", "All"},
{"4", "Other"}
};
PrimaryDrop = primaryDrop.Select(item => new SelectListItem
{
Value = item.Key,
Text = item.Value
});
And displaying it like this
#Html.DropDownListFor(m => m.SelectedPrimary, new SelectList(Model.PrimaryDrop, "Value", "Text"), "Select ...", new { #class = "form-control" })
How can I select a default value to 'Other' for example
Was thinking something like this
#Html.DropDownListFor(m => m.SelectedPrimary, new SelectList(Model.PrimaryDrop, "Value", "Text", new { SelectedItem = "Other" }), "Select ...", new { #class = "form-control" })
but doesn't work
You don't need to create an object to specify the selected item, you just need to give the value you want. In your case, Other has a value of 4:
#Html.DropDownListFor(m => m.SelectedPrimary,
new SelectList(ViewBag.PrimaryDrop, "Value", "Text", "4"),
"Select ...",
new { #class = "form-control" })
You can achieve it by server code, when you populate data
PrimaryDrop = primaryDrop.Select(item => new SelectListItem
{
Value = item.Key,
Text = item.Value,
Selected = item.Key == "4" // Or item.Value== "Others"
});
Or we can set value for SelectedPrimary of model
SelectedPrimary = "4"

Default Empty Option for MVC dropdown menu

I have the following DropDownListFor that displays a list of states for the user to choose from. How can I default the dropdown to be empty. It currently defaults to the first state in alphabetical order ("Alaska")
#Html.DropDownListFor(m => m.User.StateID,
new SelectList(Model.User.States.Where(filter => filter.Active && (filter.CountryID == 1))
.Select(item => new
{
ID = item.StateProvinceID,
Description = item.Name
}),
"ID",
"Description",
Model.User.StateID),
new { #data_bind = "value: user.StateID, enable:!isSiteUser()", tabindex = "10" })
I figured out that one of the posted questions did have the correct answer for my problem. I was just trying to do use it incorrectly. I was adding "string.Empty" to the wrong location. This is the solution.
#Html.DropDownListFor(m => m.User.StateID,
new SelectList(Model.User.States.Where(filter => filter.Active && (filter.CountryID == 1))
.Select(item => new
{
ID = item.StateProvinceID,
Description = item.Name
}),
"ID",
"Description",
Model.User.StateID),
string.Empty,
new { #data_bind = "value: user.StateID, enable:!isSiteUser()", tabindex = "10" })

Conditional enabled / disable asp.net mvc textbox

This is what I tried:
#Html.TextBoxFor(model => model.EntryDate, new { style="width:90px;",((_new || _modify) ? #disabled="disabled":"") }) #Html.ValidationMessageFor(model => model.EntryDate)
The following will work because there is only one html attribute
#Html.TextBoxFor(m => m.EntryDate, (_new || _modify)
? new { #disabled = "disabled" }
: null)
However once you add the style attribute, this will generate an error because there is no implicit conversion between new { #disabled = "disabled", #Style="width:90px;" } and new { #Style="width:90px;" } so you need to do this in an if block
#if(_new || _modify) {
#Html.TextBoxFor(m => m.EntryDate, new { #disabled = "disabled", style="width:90px;")}
} else {
#Html.TextBoxFor(m => m.EntryDate, new { style="width:90px;" })
}
Edit
Casting the html dictionary to object seems to work but I've not fully tested this (and I'm not sure that its "a simple and elegant way to to it")
#Html.TextBoxFor(m => m.EntryDate, (_new || _modify)
? (object)new { #disabled = "disabled", style="width:90px;" }
: (object)new { style="width:90px;" })
I am not sure but try this one:
#Html.TextBoxFor(model => model.EntryDate, (_new || _modify) ? new{ #Style="width:90px;", #Disabled="disabled"} : new{ #Style="width:90px;"})

Resources