如何用Fluent语法编写HtmlHelper

Gre*_*Gum 4 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));
}
Run Code Online (Sandbox Code Playgroud)

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

@Html.Tag("em", Model.Title)
Run Code Online (Sandbox Code Playgroud)

产生:

<em>The Title</em>
Run Code Online (Sandbox Code Playgroud)

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

@Html.Tag("em").Content(Model.Title)
Run Code Online (Sandbox Code Playgroud)

khe*_*ang 11

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

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

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

IMyTagBuilder实现以来IHtmlString,它可以在之后使用或不使用时使用.Content().

一个伟大的把戏实现流畅的接口可使用时,使用IFluentInterface隐藏对象成员(ToString,Equals,GetHashCode以及GetType来自智能感知),它会删除一些噪音.

编辑:建立流畅API的一个很好的资源是Daniel Cazzulino 在这里建立Funq的截屏视频