This is just for curiosity
Why does this code work:
Html.TextBoxFor(x => x.Age, new { @Value = "0"})
and this doesn't:
Html.TextBoxFor(x => x.Age, new { @value = "0"})
Note the uppercase 'V' in @Value
I know value
is a keyword, but so is readonly
and it works. It's not necessary to use @Readonly
(with uppercase 'R').
Does anybody have a clue?
InputExtensions.TextBoxFor
special cases cases a few attribute names, among themvalue
(case sensitive). This is unrelated to C# keywords.In particular the value obtained from the
expression
parameter takes precedence of a property calledvalue
you pass into thehtmlAttributes
parameter.Taking a look at your example:
If you use
Html.TextBoxFor(x => x.Age, new { @value = "0"})
it will compile, butTextBoxFor
will override thevalue
attribute with the valuex.Age
evaluates to.If you use
Html.TextBoxFor(x => x.Age, new { @Value = "0"})
it will compile, and you will get two entries in the attribute dictionary, oneValue
that's"0"
, and onevalue
, that'sx.Age
.I expect the output to be something nonsensical like
<input Value="0" value="..." type="text"/>
.I'm not 100% sure but, that could be
value
is a keyword in properties,readonly
isn't. Look at properties from MSDN.My guess is that the MVC code is hard coded to look for
Value
because a MS engineer intended you to always use PascalCase property names, since that's their typical convention and PascalCase avoids conflicts with non-contextual keywords such asclass
. Notice how PascalCase properties get rendered in the HTML as lowercase.The reason is not about
value
being a keyword, since it's a contextual keyword in C# and only has special meaning (and thus turns blue in the IDE) in property getters and setters. It has no special meaning in the anonymous type passed toTextBoxFor
.