Используйте исключительный char (минус) в имени свойства анонимного типа

Проблема

Я пытаюсь объявить анонимный тип с свойством с именем data-maxchars.

Поскольку минус является оператором, он деградирует (?) мое искомое имя свойства в операцию, и я получаю ошибку компиляции: Invalid anonymous type member declarator.

Я знаю, что я могу избежать зарезервированных слов, используя @, но я не могу понять, есть ли способ избежать минуса.

object attributes = (object)new { @class = "foo" } // OK

Происхождение

Анонимный тип передается как аргумент object в TextAreaExtensions.TextArea: <%= Html.TextArea(Model.Field.Id, val, rows, cols, attributes)%>. Это генерирует ввод с доставленными атрибутами.

Я хочу использовать прогрессивное усовершенствование JS, чтобы ограничить количество символов, которые пользователь может вставить.
Поэтому я использую префикс data- для моего атрибута: http://ejohn.org/blog/html-5-data-attributes/

Альтернативы

  • При написании этого я заметил, что существует перегрузка, в которой вместо ID объекта используется IDictionary.
  • Я могу написать ввод вручную.
  • Я мог бы использовать другой префикс и игнорировать стандарты. (Boo!)

Но если есть способ использовать смешное имя свойства, я хотел бы изучить его.

Ответы

Ответ 1

Начиная с ASP.NET MVC 3, вы можете использовать символ подчеркивания (_), он будет автоматически заменен на - для генерации HTML. Магия выполняется в HtmlHelper.AnonymousObjectToHtmlAttributes.

Например: new { data_abc = "def" } будет сгенерирован как data-abc="def".

Ответ 2

Это невозможно вообще, если вы не генерируете свои собственные классы через Reflection.Emit. Но для этого вам все равно придется пройти какой-то "словарь", чтобы вы могли пойти на это.

Использование инициализаторов коллекции С# 3 должно сделать его намного лучше.

Ответ 3

Я могу что-то пропустить, но идентификаторы на С# просто не могут содержать минус...

private int data-maxchars; // <- invalid