2013-04-21 9 views
6

Ich möchte fließend API zu meinen Websites mvc implementieren. Ich habe die Grundlagen.Wie implementieren Sie fließende API in ASP.NET MVC?

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

Aber wie es ohne irgendeine Methode flush calling in Rasierer Ansicht zu verwenden: So Objektbibliothek wie implementieren.

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

Aber es gibt den Namen der Klasse zurück. Ich habe versucht, einen impliziten Operator zu MvcHtmlString zu machen, aber er wird nicht aufgerufen. Irgendeine Idee, wie man das erreicht. Wie man es erkennt, ist das und der Kette. Ich mag die Art und Weise, wie die Kendo UI arbeiten.

Danke,
Péter

+0

Bitte hören Sie auf "ASP.NET MVC" einfach als "MVC" zu verweisen. Eines ist ein Framework, während das andere ein sprachunabhängiges Designmuster ist. Es ist wie IE - "das Internet" –

Antwort

4

Die Klassen UIElement müssen die Schnittstelle IHtmlString implementieren. Die Methode ToHtmlString dieser Schnittstelle wird von Razor aufgerufen und sollte eine HTML-codierte Zeichenfolge zurückgeben.

So würde ich dies auf der Basis Abscract implementieren UIElement und RenderHtml Verfahren schaffen, die durch die konkrete LinkButton umgesetzt werden können usw. Klassen:

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

Wenn Sie überprüfen KendoUI in Reflector/JustDecompile/dotPeek in der WidgetBase Klasse werden Sie das gleiche Muster sehen.

+0

Brilliant !!!!!!! –

0

ich es nicht versucht haben, in dieser besonderen Situation, aber Sie könnten eine implizite Umwandlung zu verwenden, um von einem fließend Builder auf das Objekt zu konvertieren Sie benötigen (siehe diese blog).