这只是为了好奇
为什么此代码有效:
Html.TextBoxFor(x => x.Age, new { @Value = "0"})
而这不是:
Html.TextBoxFor(x => x.Age, new { @value = "0"})
请注意@Value
我知道value
是一个关键字,但readonly
也是如此。没有必要使用@Readonly
(大写'R')。
有人有线索吗?
答案 0 :(得分:6)
InputExtensions.TextBoxFor
特殊情况下有一些属性名称,其中包括value
(区分大小写)。这与C#关键字无关。
特别是从expression
参数获取的值优先于您传递到value
参数的名为htmlAttributes
的属性。
看看你的例子:
如果您使用Html.TextBoxFor(x => x.Age, new { @value = "0"})
,则会进行编译,但TextBoxFor
会覆盖value
属性,值x.Age
的评估结果为。
如果您使用Html.TextBoxFor(x => x.Age, new { @Value = "0"})
它将进行编译,您将在属性字典中获得两个条目,一个Value
为"0"
,一个value
,那是x.Age
。
我希望输出像<input Value="0" value="..." type="text"/>
一样荒谬。
答案 1 :(得分:3)
答案 2 :(得分:0)
我的猜测是MVC代码被硬编码以寻找Value
,因为MS工程师希望您始终使用PascalCase属性名称,因为这是他们的典型约定,并且PascalCase避免与非上下文关键字冲突,例如class
。请注意PascalCase属性如何在HTML中呈现为小写。
原因不是value
是关键字,因为它是C#中的上下文关键字,并且在属性getter和setter中只有特殊含义(因此在IDE中变为蓝色) 。它在传递给TextBoxFor
的匿名类型中没有特殊含义。