asp.net-mvc - 如何用 Fluent 语法编写 HtmlHelper

标签 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 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 中隐藏对象成员(ToStringEqualsGetHashCodeGetType),它会消除一些噪音。

编辑:用于构建流畅 API 的重要资源是 Daniel Cazzulino 构建 Funq 的截屏视频 here

关于asp.net-mvc - 如何用 Fluent 语法编写 HtmlHelper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669904/

相关文章:

asp.net-mvc - ASP.NET MVC 3 用户身份验证

javascript - 当文本框为空时抑制表单发布

php - CakePHP 3 : HTMLHelper:url missing

c - 错误 : fluent. 14.5.7 UDF(分段冲突)

swift - 当此代码运行时,为什么没有在 Vapor 中创建数据透视表条目?

Javascript 更新 asp.net mvc 中的部分 View

asp.net-mvc - ASP.NET MVC-Elmah无法正常工作,并为elmah.axd返回404页

c# - MVC - 根据用户的权限禁用大约一半的字段

.net - ASP MVC HTML Helpers - 好还是坏?

c# - Fluent合并到main.exe后出现的问题