如何在ASP.NET MVC中实现流畅的api?

Pét*_*ter 6 asp.net-mvc fluent-interface razor

我想在我的mvc网站上实现流畅的api.我得到了基础知识.所以实现对象库如:

public class UIElement{/*...*/}
public class ButtonBase : UIElement{/*...*/}
public class LinkButton : ButtonBase {/*...*/}

  public static class Extensions
  {
    public static T UIElementMethod<T>(this T element, string title)
      where T : UIElement
    {
      return element;
    }

    public static T ButtonBaseMethod<T>(this T element, string title)
      where T : ButtonBase
    {
      return element;
    }

    public static T LinkButtonMethod<T>(this T element, string title)
      where T : LinkButton
    {
      return element;
    }
  }
Run Code Online (Sandbox Code Playgroud)

但是如何在没有一些flush方法调用的剃刀视图中使用它.

@Html.UIproject().LinkButton()
    .UIElementMethod("asd")
    .ButtonBaseMethod("asd")
    .LinkButtonMethod("asd")
Run Code Online (Sandbox Code Playgroud)

但它返回类的名称.我试图为MvcHtmlString创建一个隐式运算符,但它没有被调用.任何想法如何实现这一点.如何知道它是链和链.我喜欢 Kendo UI的工作方式.

谢谢,
Péter

nem*_*esv 4

您的UIElement类需要实现该IHtmlString接口。该接口的ToHtmlString方法由 Razor 调用,并应返回 HTML 编码的字符串。

所以我会在抽象基础上实现这个UIElement并创建RenderHtml可以由具体LinkButton等类实现的方法:

public abstract class UIElement : IHtmlString 
{
    public string ToHtmlString()
    {
        return RenderHtml(); // This should return an HTML-encoded string.
    }

    public override string ToString()
    {
        return ToHtmlString();
    }

    protected abstract string RenderHtml();
}
Run Code Online (Sandbox Code Playgroud)

如果您检查类中 Reflector/JustDecompile/dotPeek 中的 KendoUI,WidgetBase您将看到相同的模式。