2013-04-21 27 views
6

我想實現流利的API到我的MVC網站。我有基礎知識。 所以實施對象庫,如:如何在ASP.NET 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; 
    } 
    } 

但如何使用它在Razor視圖沒有一些flush方法調用。

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

但它返回類的名稱。我試圖給MvcHtmlString一個隱式運算符,但它沒有被調用。 任何想法如何實現這一點。如何知道它是鏈條和鏈條。我喜歡Kendo UI的工作方式。

感謝,
彼得

+0

請停止將「ASP.NET MVC」簡稱爲「MVC」。一個是框架,而另一個是獨立於語言的設計模式。這就像打電話給IE - 「互聯網」 – 2013-04-21 06:32:32

回答

4

您的UIElement類需要實現IHtmlString接口。這個接口的ToHtmlString方法被Razor調用,並且應該返回一個HTML編碼的字符串。

所以我會實現這個的abscract基地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(); 
} 

如果檢查KendoUI在反射器/ JustDecompile/dotPeek WidgetBase類將會看到相同的模式。

+0

輝煌!!!!!!! – 2014-04-25 11:22:47

0

我還沒有嘗試過,在這種特殊情況,但您可能能夠使用隱式轉換,從一個流暢的建設者轉換成你需要的對象(見本blog )。