这就是为什么我对 MVC 团队决定在任何地方都使用字符串感到如此不满的原因。向文本框添加类不应该是 TextBox HtmlHelper 关心的问题,它应该是构建 HTML 的一个单独方面。这是使用语义模型定义 Html 的更好解决方案。我将在这里使用 TagBuilder,但我强烈建议您查看 FubuMvc 中包含的 HtmlTags 库。
public TagBuilder TextBox(this HtmlHelper helper, string name, string value)
{
var tag = new TagBuilder("input");
tag.MergeAttribute("type", "text");
tag.MergeAttribute("name", name);
tag.MergeAttribute("value", value);
return tag;
}
现在,由于我们返回了一个语义 (TagBuilder) 模型,我们可以继续修改模型,然后再将其转换为 HTML 文字。ConditionallyAddClass 是一个可重用的扩展方法,它将一个类应用于任何 TagBuilder 模型:
public TagBuilder ConditionallyAddClass<T>(this TagBuilder tag, string @class, T model, Func<T, bool> condition)
{
if(condition(model))
{
tag.AddCssClass(@class);
}
return tag;
}
在您看来,您现在可以这样做(假设 StyleAgeTextbox 是一个布尔属性):
<%= Html.TextBox("Age", Model.Age).ConditionallyAddClass("customClass", Model, m => m.StyleAgeTextbox) %>
视图引擎会自动调用 TagBuilder 上的 ToString() 以获取正确的 HTML。
我希望这能给你基本的想法。当然有很多方法可以扩展它。您可以有一个标准的命名约定并使用一种dynamic
类型来绕过使用表达式,或者您可以有查找表或强类型整个事物以使用成员表达式(例如 TextBoxFor(m => m.Age))。我更喜欢像 Fubu那样将整个东西移动到一个 html 约定框架中,但这可能超出了大多数项目的范围。