Asp.Net MVC 5 i własny HtmlHelper

Odpowiedz Nowy wątek
2018-07-12 09:44
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

edytowany 2x, ostatnio: rmawerik, 2018-07-12 09:53

Pozostało 580 znaków

2018-07-12 11:12
0

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


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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