我正在为基于不可避免的 Twitter Bootstrap 框架的应用程序创建一些基于 Fubu 项目的HtmlTags 库的 HTML Helper 方法。对于大多数简单的控件,我直接子类化 HtmlTag 没有问题;然而,当涉及到通常需要嵌套在 div 标签中的更复杂的控件时,它会变得更复杂一些。
例如,我有一个 TextboxWidget,它的实现如下:
public class TextboxWidget : HtmlTag
{
public TextboxWidget() : base("input")
{
Attr("type", "text");
AddClass("form-control");
NoClosingTag();
}
}
这很简单。然后可以像这样使用它(使用其他一些扩展方法):
@Html.Bootstrap().Textbox(m => m.FirstName).Data("bind", "Employee.FirstName")
给出想要的结果。
我对 DatepickerWidget 的实现是这样的:
public class DatepickerWidget : HtmlTag
{
public DatepickerWidget() : base("input")
{
Attr("type", "text");
Attr("role", "datepicker");
AddClasses("form-control", "datepicker");
Data("dateformat", "dd/mm/yy");
Button = new HtmlTag("span").AddClass("input-group-addon");
var icon = new HtmlTag("i").AddClass("icon-calendar");
Button.Append(icon);
Append(Button);
WrapWith(new DivTag().AddClass("input-group"));
}
}
然后像这样使用它:
@Html.Bootstrap().Datepicker(m => m.StartDate).DataBind("click", "fnProcessClick").AddClass("special-offer")
但由于某种原因,没有呈现包装 div 标签。如果我为控件编写一些单元测试,那么我可以在对象模型中看到 div 标记(在 Parent 属性中),但它永远不会在页面上变成 HTML。
我真的很想将主输入元素作为控件的焦点元素,所以所有漂亮的 HtmlTag 扩展都挂在小部件上;我是否必须通过为控件中的每个单独元素公开修饰符来遵循 Jimmy Bogard 显示的路线?