2013-04-21 17 views
6

Tôi muốn triển khai api thông thạo cho các trang web mvc của mình. Tôi đã có những điều cơ bản. Vì vậy, hãy triển khai thư viện đối tượng như:Làm thế nào để thực hiện api thông thạo trong 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; 
    } 
    } 

Nhưng cách sử dụng thư viện này ở chế độ xem dao cạo mà không cần gọi phương thức xả.

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

Nhưng nó sẽ trả về tên của lớp học. Tôi đã cố gắng để làm cho một nhà điều hành tiềm ẩn để MvcHtmlString nhưng nó không được gọi. Bất kỳ ý tưởng nào để đạt được điều này. Làm thế nào để biết đó là và của chuỗi. Tôi thích cách thức hoạt động của Kendo UI.

Cảm ơn,
Péter

+0

Vui lòng dừng tham chiếu đến "ASP.NET MVC" đơn giản là "MVC". Một là một khuôn khổ, trong khi khác là một khuôn mẫu thiết kế độc lập về ngôn ngữ. Nó giống như gọi IE - "internet" –

Trả lời

4

Các lớp UIElement của bạn cần triển khai giao diện IHtmlString. Phương thức ToHtmlString của giao diện này được gọi bởi Razor và phải trả về chuỗi được mã hóa HTML.

Vì vậy, tôi sẽ thực hiện điều này trên cơ sở abscract UIElement và tạo RenderHtml phương pháp có thể được thực hiện bằng bê tông các LinkButton vv lớp:

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

Nếu bạn kiểm tra KendoUI trong Reflector/JustDecompile/dotPeek trong WidgetBase lớp bạn sẽ thấy cùng một mẫu.

+0

Brilliant !!!!!!! –

0

Tôi đã không thử nó, trong tình huống đặc biệt này, nhưng bạn có thể có thể sử dụng một diễn viên tiềm ẩn để chuyển đổi từ một người thợ xây thạo đến đối tượng bạn cần (xem này blog).