我想要一套用于生成表单输入的Razor助手。我希望帮助程序具有可链接的API,允许从多个上下文(在表单组内,作为独立输入)调用表单输入,并使用多个可自定义的属性(值,占位符,类等)。我不想要实现100多个方法重载来实现我的目标。
示例API:
@Html.TextField("Test Text")
@Html.TextField("PhoneNumber").Placeholder("555-555-5555")
@Html.TextField("FirstName").Value("Gilbert")
@Html.TextField("LastName").Value("Grape").Placeholder("Last Name Here")
我有一个支持这种语法的实现,但我担心它依赖于hack才能运行。请检查一下这个实现,告诉我是否犯了错误。感兴趣的部分在ChainableTextField.ToString()
:
public static class HtmlFormExtensions
{
public static ChainableTextField TextField(this HtmlHelper html, string name)
{
return new ChainableTextField(html.ViewContext.Writer,name);
}
public class ChainableTextField
{
private readonly TextWriter _writer;
private readonly TagBuilder _tagBuilder;
public ChainableTextField(TextWriter writer, string name)
{
_writer = writer;
_tagBuilder = new TagBuilder("input");
_tagBuilder.Attributes["name"] = name;
_tagBuilder.Attributes["type"] = "text";
}
public ChainableTextField Value(string value)
{
_tagBuilder.Attributes["value"] = value;
return this;
}
public ChainableTextField Placeholder(string placeHolder)
{
_tagBuilder.Attributes["placeholder"] = placeHolder;
return this;
}
public override string ToString()
{
_writer.WriteLine(_tagBuilder.ToString(TagRenderMode.SelfClosing));
return "";
}
}
}
“黑客”是
public override string ToString()
{
_writer.WriteLine(_tagBuilder.ToString(TagRenderMode.SelfClosing));
return "";
}
这样做不好吗?如果我使用这种技术,我会遇到麻烦吗?
答案 0 :(得分:4)
IHtmlString
接口专门用于此目的。因此,您希望您的ChainableTextField
类实现此接口,而不是覆盖ToString
方法。这样您就不再需要将TextWriter
传递给此类的构造函数。