У меня есть метод расширения HtmlHelper, который я пишу для веб-сайта MVC / Razor.Сигнатура метода выглядит следующим образом:
public static IHtmlString CharacterCountOf<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Func<Expression<Func<TModel, TProperty>>, object, IHtmlString> helperMethod,
Expression<Func<TModel, TProperty>> expression,
object htmlAttributes){}
Если вы заметили, что я принимаю сигнатуру метода в качестве параметра.Этими методами обычно будут другие методы HtmlHelper, такие как TextAreaFor()
.object
в сигнатуре метода - это атрибуты html.Я хотел бы взять анонимный тип, добавить свой собственный атрибут к объекту, а затем вызвать сигнатуру метода, переданную в качестве параметра.Вот так:
var identifier = Guid.NewGuid().ToString();
// somehow add identifier to htmlAttributes
helperMethod(expression, htmlAttributes)
Все решения, с которыми я сталкивался, либо меняют htmlAttributes на IDictionary
, который затем не будет работать для сигнатуры метода, либо требуют, чтобы вы знали, как был анонимный типструктурированные.
Вот некоторые из различных подходов, которые я пробовал / изучал: Использование объекта Json для создания анонимного типа, Использование метода расширения для сопоставления словаряв анонимный тип или преобразовать анонимный тип в словарь, expandoObject или динамический
Поскольку было предложено, вот почему я задаю этот вопрос: этот метод используетсясоздать HTML / JS, который считает количество символов в текстовом поле / области и отображает это количество в правом нижнем углу.Изначально у меня был весь код в HTML / JS, но пока я выполнял рефакторинг существующих текстовых вводов, я обнаружил, что количество шагов, необходимых для реализации этой функции, было раздражающим и сложным.Я мог бы использовать C #, чтобы всегда включать раздражающие биты, которые делают эту работу.С новым методом рефакторинг и добавление этой функции к новым текстовым вводам становится очень простым.
Изначально я пытался запускать события JS для атрибута name, который генерируется $([name='Description']).on('keyup')
, который работал прекрасно, пока я не столкнулся с проблемой, когдатам, где более одного элемента с этим атрибутом и значением в DOM.Поэтому мне нужен был способ добавить уникальный идентификатор в элемент HTML, который JS будет использовать для просмотра ввода текста.