TextBoxFor @Value (верхний регистр) вместо @value

Это просто для любопытства

Почему этот код работает:

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

и это не так:

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

Обратите внимание на верхний регистр "V" в @Value

Я знаю, что value - это ключевое слово, но это также readonly, и оно работает. Нет необходимости использовать @Readonly (с верхним регистром "R" ).

Есть ли у кого-нибудь ключ?

Ответ 1

Я не уверен на 100%, но это может быть value - это ключевое слово в свойствах, readonly - нет. Посмотрите свойства из MSDN.

enter image description here

enter image description here

Ответ 2

InputExtensions.TextBoxFor в особых случаях используется несколько имен атрибутов, среди которых value (с учетом регистра). Это не связано с ключевыми словами С#.

В частности, значение, полученное из параметра 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"/>.

Ответ 3

Я предполагаю, что код MVC жестко закодирован, чтобы искать Value, потому что инженер MS предполагал, что вы всегда используете имена свойств PascalCase, так как их типичное соглашение и PascalCase избегают конфликтов с неконтективными ключевыми словами, такими как class. Обратите внимание, как свойства PascalCase отображаются в HTML как строчные.

Причина не в том, что Value является ключевым словом, так как это ключевое слово контекста в С# и имеет особое значение (и, таким образом, становится синим в среде IDE) в свойствах getter и seters. Он не имеет особого значения в анонимном типе, переданном TextBoxFor.