2010-09-10 26 views
1

有人能指出我正確的方向,我將如何去創建htmlhelpers,你可以在視圖中調用下面的代碼。如何創建流暢的樣式MVC 2 Html.Helper?

<% using (Html.BeginSvg()) 
    {%> 
    <% using (Html.BeginGroup("Group1")) {%> 
     <%= Html.SvgLine("Line1").Class("blueLine").Style("stroke-width:2px").X1(25).Y1(25).X2(25).Y2(25).Transform().Scale(-2)%> 
     <%= Html.SvgLine("Line1").Class("blueLine").Style("stroke-width:2px").X1(100).Y1(25).X2(100).Y2(125).Transform().Scale(-2)%> 
    <%} %> 
    <%= Html.SvgRect("box").Class("redBox").X(12).Y(10).Width(234).Height(200) %> 
<%} %> 

這可能嗎?理智嗎? :)有沒有這樣的東西已經實現?

乾杯 硅

回答

0

我不知道它是否已經完成,但是流利的接口是真棒......這裏是你一個非常基本的實現。

public static class SvgLineHelper { 
    public static SvgLine SvgLine(this HtmlHelper helper, string name) { 
     return new SvgLine(name); 
    } 
} 

public class SvgLine { 
    string _name; 
    int _x; 
    int _y; 
    int _width; 
    int _height; 
    IList<string> _styles; 

    public SvgLine(string name) { 
     _styles = new List<string>(); 
     _name = name; 
    } 

    public static SvgLine Create(string name) { 
     return new SvgLine(name); 
    } 

    public SvgLine X(int x) { 
     this._x = x; 
     return this; 
    } 

    public SvgLine Width(int width) { 
     this._width = width; 
     return this; 
    } 

    public SvgLine Style(string style) { 
     this._styles.Add(style); 
     return this; 
    } 

    public override string ToString() { 
     //create your string from this object here 
     return string.Format("x:{0}, width:{1}, style:{2}", _x, _width, _styles[0]); 
    } 
} 

這裏是你如何使用它在你的HTML

<% Html.SvgLine("test").X(100).Width(50).Style("stroke-width:2px").ToString() %> 

你必須調用toString方法作爲最後一個電話(或定型的流暢接口的另一種方法 - 返回字符串的一個代表您的對象)

+0

嗨莫爾德,明確指出我在那裏的正確方向,謝謝。 – 2010-09-10 22:49:53

+0

使用此方法將有任何方法來構建邏輯,即 <%Html.SvgLine(「test」)。X(100).X 如果您已經設置X,則無法再設置它。 – 2010-09-10 22:53:56

+0

不是真的,因爲它只是一個常規的函數調用,並不真正服從這些類型的規則......但是,通過檢查內部值是否先設置,您可以忽略任何後續步驟。 – Buildstarted 2010-09-11 00:53:20

0

<%=呼叫的Html助手必須返回stringMvcHtmlString。所以,除非你在末尾添加一個ToString什麼的,像你提出API將無法正常工作:

<%= Html.SvgLine("Line1").Class("blueLine").ToMvcHtmlString() %> 

另外,還可以通過一個流暢的配置對象作爲參數傳遞給SvgLine

<%= Html.SvgLine(With().Name("Line1").Class("blueLine")) %> 

無論哪種方式將工作。選擇你喜歡的任何一個。

+0

我不認爲你必須實際做/調用ToString方法。 object.ToString()應該被自動調用,你所要做的就是覆蓋它。 – Necros 2010-09-10 14:42:08

+0

@Necros:不適用於'MvcHtmlString',否。我猜測他正在返回尖括號,所以這就是他需要的ASP.NET 4. – 2010-09-10 15:30:31

+0

如果你想使用'<%:',那麼是的,你需要'MvcHtmlString'。對於'<%=',字符串將會執行。 – Necros 2010-09-10 16:36:30