我有一个简单的标记构建器,如下所示:
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)
答案 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
来隐藏对象成员(ToString
,Equals
,GetHashCode
和GetType
)来自IntelliSense,它可以消除一些噪音。
编辑:构建流畅API的一个很好的资源是Daniel Cazzulino在构建Funq时的截屏视频here