可链式剃刀助手API

时间:2014-02-24 16:16:07

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5

我想要一套用于生成表单输入的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 "";
}

这样做不好吗?如果我使用这种技术,我会遇到麻烦吗?

1 个答案:

答案 0 :(得分:4)

IHtmlString接口专门用于此目的。因此,您希望您的ChainableTextField类实现此接口,而不是覆盖ToString方法。这样您就不再需要将TextWriter传递给此类的构造函数。