6

我想在我的 mvc 站点上实现 fluent 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;
    }
  }

但是如何在没有一些刷新方法调用的情况下在剃刀视图中使用它。

@Html.UIproject().LinkButton()
    .UIElementMethod("asd")
    .ButtonBaseMethod("asd")
    .LinkButtonMethod("asd")

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

谢谢,
彼得

4

2 回答 2

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();
}

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

于 2013-04-21T06:27:16.503 回答
0

在这种特殊情况下,我没有尝试过,但您可以使用隐式转换从流利的构建器转换为您需要的对象(请参阅此博客)。

于 2013-04-21T05:51:26.050 回答