【发布时间】:2014-02-24 16:16:06
【问题描述】:
我想要一套用于生成表单输入的 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 "";
}
这样做是不好的做法吗?如果我使用这种技术,我以后会遇到麻烦吗?
【问题讨论】:
-
特别是哪一点是hack?
-
我更新了问题,澄清了我认为的黑客攻击
标签: c# asp.net asp.net-mvc razor asp.net-mvc-5