首页 > 解决方案 > 将 HTML 属性添加到匿名类型而不更改方法签名

问题描述

我有一个为 MVC/Razor 网站编写的 HtmlHelper 扩展方法。方法签名如下:

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(). 方法签名中的objecthtml 属性。我想做的是取匿名类型,将我自己的属性添加到对象,然后调用作为参数传入的方法签名。像这样:

var identifier = Guid.NewGuid().ToString();
// somehow add identifier to htmlAttributes
helperMethod(expression, htmlAttributes)

我遇到的所有解决方案要么将 htmlAttributes 更改为不适IDictionary用于方法签名的方法,要么要求您知道匿名类型的结构。

以下是我尝试/研究过的一些不同方法:使用 Json 对象构造匿名类型, 使用扩展方法将字典映射到匿名类型将匿名类型转换为字典、expandoObject 或动态

既然这里有人建议,这就是我问这个问题的原因:此方法用于生成 HTML/JS,它计算文本框/区域中的字符数并在右下角显示该计数。我最初拥有 HTML/JS 中的所有代码,但是当我重构现有的文本输入时,我发现实现此功能所需的步骤数量令人讨厌且繁琐。我可以使用 C# 来始终包含使这项工作有效的烦人部分。使用新方法重构并将此功能添加到新的文本输入中变得非常容易。

最初,我尝试在生成的 name 属性上触发 JS 事件,$([name='Description']).on('keyup')这非常有效,直到我遇到问题,当 DOM 中存在多个具有该属性和值的元素时。因此,我需要一种方法来为 JS 用来观察文本输入的 HTML 元素添加一个唯一标识符。

标签: c#asp.net-mvcrazorextension-methodshtml-helper

解决方案


推荐阅读