Asp.Net MVC 5 i własny HtmlHelper

0

Cześć!
Tworzę sobie własne HtmlHelper's coby ułatwić sobie życie.

//Render Label
public class Label
{
    private string text;
    private readonly HtmlHelper html;

    public Label(HtmlHelper html)
    {
        this.html = html;
    }

    public Label Text(string text)
    {
        this.text = text;
        return this;
    }

    public MvcHtmlString GetHtml()
    {
        TagBuilder label = new TagBuilder("label");
        label.InnerHtml = text;

        return MvcHtmlString.Create(label.ToString(TagRenderMode.Normal));
    }
}

//HtmlHelper extension
public static Label MyLabel(this HtmlHelper html)
{
    return new Label(html);
}

//Render Input
public class Input
{
    private string id;
    private readonly HtmlHelper html;

    public Input(HtmlHelper html)
    {
        this.html = html;
    }

    public Input Id(string id)
    {
        this.id = id;
        return this;
    }

    public MvcHtmlString GetHtml()
    {
        TagBuilder input = new TagBuilder("input");
        input.MergeAttribute("id", id);
        input.MergeAttribute("type", "text");
        
        input.AddCssClass("form-control");

        return MvcHtmlString.Create(input.ToString(TagRenderMode.SelfClosing));
    }
}

//HtmlHelper extension
public static Input MyInput(this HtmlHelper html)
{
    return new Input(html);
}

W widoku używam

@(Html.MyLabel()
    .Text("My label")
    .GetHtml())

@(Html.MyInput()
    .Id("txt123")
    .GetHtml())

i w efekcie dostaję

<label>My label</label>
<input type="text" class="form-control" id="txt123">

I teraz chciałbym móc utworzyć helpera, który korzystałby z powyższych klas i przy zapisie

@(Html.MyFormGroup()
    .Label()
        .Text("My label")
    .Input()
        .Id("txt123")
    .GetHtml())

wygenerował mi

<div class="form-group">
    <label>My label</label>
    <input type="text" class="form-control" id="txt123">
</div>

Utworzyłem odpowiednią klasę

//Render Form Group
public class FormGroup
{
    private string css;
    private readonly HtmlHelper html;

    public FormGroup(HtmlHelper html)
    {
        this.html = html;
    }

    public FormGroup Css(string css)
    {
        this.css = css;
        return this;
    }
    
    public MvcHtmlString GetHtml()
    {
        TagBuilder divFormGroup = new TagBuilder("div");
        if (css != null)
            divFormGroup.AddCssClass(css.ToLower());

        divFormGroup.AddCssClass("form-group");
        divFormGroup.MergeAttribute("id", id);

        return MvcHtmlString.Create(divFormGroup.ToString(TagRenderMode.Normal));
    }
}

ale nie mam pomysłu jak dopisać do niej Label i Input żeby działało.
Ma ktoś pomysła?

Pozdr
rm

0

No z tego wynika, że Label() i Input() to powinny być metody klasy FormGroup.
Poczytaj o wzorcu builder.

1 użytkowników online, w tym zalogowanych: 0, gości: 1