Как создать беглый стиль MVC 2 Html.Helper? - PullRequest
1 голос
/ 10 сентября 2010

Может ли кто-нибудь указать мне правильное направление о том, как бы я начал создавать htmlhelpers, которые вы могли бы вызывать в представлении, что-то вроде кода ниже.

   <% 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) %>
<%} %>

Возможно ли это? это нормально? :) что-то подобное уже реализовано?

Приветствие Si

Ответы [ 2 ]

0 голосов
/ 10 сентября 2010

Помощники HTML, вызываемые с помощью <%=, должны возвращать string или MvcHtmlString. Поэтому предлагаемый вами API не будет работать, если вы не добавите ToString или что-то в конце, например:

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

Кроме того, вы можете передать свободный конфигурационный объект в качестве аргумента SvgLine:

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

В любом случае будет работать. Выберите то, что вам нравится.

0 голосов
/ 10 сентября 2010

Я не знаю, было ли это сделано, но интерфейсы Fluent потрясающие ... вот вам базовая реализация.

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 как последний вызов (или другой метод, который завершает ваш свободный интерфейс - тот, который возвращает строковое представление вашего объекта)

...