如何用Fluent语法编写HtmlHelper

时间:2014-03-26 18:26:23

标签: asp.net-mvc html-helper fluent

我有一个简单的标记构建器,如下所示:

public static MvcHtmlString Tag(this HtmlHelper helper, string tag, string content)
{
    var tagBuilder = new TagBuilder(tag){InnerHtml = content};
    return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.NormalTag));
}

而且,我可以这样使用它:

@Html.Tag("em", Model.Title)

产生:

<em>The Title</em>

如何使用Fluent语法编写它,因此它的用法如下:

@Html.Tag("em").Content(Model.Title)

1 个答案:

答案 0 :(得分:11)

您必须定义构建器界面和实现。我希望我的例子可以提供一些指导:

public static class MyHtmlExtensions
{
    public static IMyTagBuilder Tag(this HtmlHelper helper, string tag)
    {
        return new MyTagBuilder(tag);
    }
}

然后定义构建器界面和实现:

public interface IMyTagBuilder : IHtmlString
{
    IHtmlString Content(string content);
}

public class MyTagBuilder : IMyTagBuilder
{
    private readonly TagBuilder _tagBuilder;

    public MyTagBuilder(string tag)
    {
        _tagBuilder = new TagBuilder(tag);
    }

    public IHtmlString Content(string content)
    {
        _tagBuilder.InnerHtml = content;
        return this;
    }

    public string ToHtmlString()
    {
        return _tagBuilder.ToString(TagRenderMode.NormalTag);
    }
}

由于IMyTagBuilder实施了IHtmlString,因此无论是否可以在调用.Content()之后使用它。

在实现流畅的界面时使用的一个很好的技巧是使用IFluentInterface来隐藏对象成员(ToStringEqualsGetHashCodeGetType)来自IntelliSense,它可以消除一些噪音。

编辑:构建流畅API的一个很好的资源是Daniel Cazzulino在构建Funq时的截屏视频here