我有一个简单的标签生成器,如下所示:
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 Syntax,以便其使用如下所示:
@Html.Tag("em").Content(Model.Title)
最佳答案
您必须定义构建器接口(interface)和实现。我希望我的例子可以提供一些指导:
public static class MyHtmlExtensions
{
public static IMyTagBuilder Tag(this HtmlHelper helper, string tag)
{
return new MyTagBuilder(tag);
}
}
然后定义构建器接口(interface)和实现:
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
从 IntelliSense 中隐藏对象成员(ToString
、Equals
、GetHashCode
和 GetType
),它会消除一些噪音。
编辑:用于构建流畅 API 的重要资源是 Daniel Cazzulino 构建 Funq 的截屏视频 here
关于asp.net-mvc - 如何用 Fluent 语法编写 HtmlHelper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669904/