TextBoxFor @Value(大写)代替@value

时间:2013-01-03 16:01:25

标签: c# asp.net-mvc keyword html.textboxfor

这只是为了好奇

为什么此代码有效:

Html.TextBoxFor(x => x.Age, new { @Value = "0"})

而这不是:

Html.TextBoxFor(x => x.Age, new { @value = "0"})

请注意@Value

中的大写“V”

我知道value是一个关键字,但readonly也是如此。没有必要使用@Readonly(大写'R')。

有人有线索吗?

3 个答案:

答案 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)

我不是100%肯定,但可能value是属性中的关键字,readonly不是。请看properties from MSDN

enter image description here

enter image description here

答案 2 :(得分:0)

我的猜测是MVC代码被硬编码以寻找Value,因为MS工程师希望您始终使用PascalCase属性名称,因为这是他们的典型约定,并且PascalCase避免与非上下文关键字冲突,例如class。请注意PascalCase属性如何在HTML中呈现为小写。

原因不是value是关键字,因为它是C#中的上下文关键字,并且在属性getter和setter中只有特殊含义(因此在IDE中变为蓝色) 。它在传递给TextBoxFor的匿名类型中没有特殊含义。