【问题标题】:Chainable Razor Helper API可链接的 Razor 助手 API
【发布时间】: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


【解决方案1】:

IHtmlString 接口专为此目的而设计。所以你宁愿让你的ChainableTextField 类实现这个接口,而不是重写ToString 方法。这样,您不再需要将 TextWriter 传递给此类的构造函数。

【讨论】:

  • 那么,使用 IHtmlString,我可以生成一个 ChainableTextField,然后在最终显示之前选择性地更改它(使用 Placeholder()Value())?
  • 啊,我确实可以!谢谢你。我怀疑有这样的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 2016-02-11
  • 2011-05-25
相关资源
最近更新 更多