Добавить атрибут HTML в анонимный тип без изменения сигнатуры метода - PullRequest
0 голосов
/ 18 мая 2018

У меня есть метод расширения 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 будет использовать для просмотра ввода текста.

...