【问题标题】:How to write HtmlHelper in Fluent syntax如何用流畅的语法编写 HtmlHelper
【发布时间】:2014-05-05 09:08:38
【问题描述】:

我有一个简单的标签生成器,如下所示:

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>

如何编写它以使用流畅的语法,所以它的使用看起来像这样:

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

【问题讨论】:

  • 与常规 HTML 相比,这有什么好处?通常不推荐这种类型的东西,因为任何进入该项目的开发人员(可能已经知道 HTML)现在都必须学习你的包装器。它还使编写 HTML 更冗长且可读性更低。
  • 我希望实现的好处是尽可能地抽象 HTML(为了以 C# 为中心的开发人员,而不是 HTML 开发人员的利益)。我的目标不一定是针对这样的简单场景,而是开发更复杂的 Html 构建器,这些构建器具有许多可从 Fluent 语法中受益的移动部件。

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


【解决方案1】:

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

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 来从 IntelliSense 中隐藏对象成员(ToStringEqualsGetHashCodeGetType),它消除了一些噪音。

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

【讨论】:

  • +1 - 这看起来可行,尽管您可能希望在标签生成器中存储对原始 HTML 帮助器对象的引用以供以后访问(因为它包含大量有用的信息) .
  • @TimMedora 绝对是,但在这个例子中它不需要:)
  • 添加了一个关于流畅 API 的精彩视频的链接
  • 如果可以的话,我会多次支持你的答案,你的解释非常清楚,对我的项目很有帮助。
猜你喜欢
  • 2015-06-30
  • 2013-06-07
  • 2022-01-21
  • 1970-01-01
  • 2014-12-31
  • 2014-02-14
  • 2012-04-25
  • 2015-08-04
  • 1970-01-01
相关资源
最近更新 更多