C# fluent interface(цепочные интерфейсы),Custom HtmlHelper

199
18 июля 2018, 22:20

Продолжение темы fluent interface

Для реализации своего HTMLHelper

Пример:

@(Html.ExExtensions().TabStrip()
        .Name("tabs")
        .Collapse(true)
        .Text("Some text")
        .Items(
               item=>{
                      .Add().Text("Tab 1").Selected(true).Content("Content tab 1");
                      .Add().Text("Tab 2").Content("Content tab 2");
                     }
              )
 )

Этот рендерится в такой HTML код:

<section id="tabs" class="collapsible">
<h2>Some text</h2>
<div class="collapsible-content">
    <div class="tabstrip">
        <div class="triggers">
            <span class="trigger active">Tab 1</span>
            <span class="trigger">Tab 2</span>
        </div>
        <div class="tabs">
            <div class="tab">Content tab 1</div>
            <div class="tab">Content tab 2t</div>
        </div>
    </div>
</div>

Есть 3 класса: ExHTMLHelperExtension класс в кором метод ExExtensions расширяет класс HtmlHelper

 public static class ExHTMLHelperExtension
{
    public static ExExtensions SFX(this HtmlHelper @this)
    {
        return new ExExtensions();
    }
}

Второй класс ExExtensions

 public class ExExtensions
{
    public ExExtensions TabStrip()
    {
        return new ExExtensions();
    }
}

Третий класс TabStrip

 public static class TabStrip
{
    private static string TabStripName { get; set; }
    private static bool TabStripCollapsible { get; set; }
    private static string TabStripText { get; set; }
    private static TagBuilder TagBuilder { get; set; }
    private static Action<ItemTabs> ItemTabs { get; set; }

    public static ExExtensions Name(this ExExtensions @this, string name)
    {
        Ensure.IsNotNullOrEmpty(name, nameof(name));
        TabStripName = name;
        return new SFXExtensions();
    }
    public static ExExtensions Collapsible(this ExExtensions @this, bool collapsible)
    {
        TabStripCollapsible = collapsible;
        return new SFXExtensions();
    }
    public static ExExtensions Text(this ExExtensions @this, string text)
    {
        Ensure.IsNotNullOrEmpty(text, nameof(text));
        TabStripText = text;
        return new SFXExtensions();
    }

    public static ExExtensions Items(this ExExtensions @this, Action<ItemTabs> itemTabs)
    {
        Ensure.IsNotNull(itemTabs, nameof(itemTabs));
        ItemTabs = itemTabs;
        return new SFXExtensions();
    }
    public static MvcHtmlString Render(this ExExtensions @this)
    {
        var tagSection = new TagBuilder("section");
        var tagDiv = new TagBuilder("div");
        var tagTab = new TagBuilder("div");
        if (TabStripName.IsNotNullOrWhiteSpace())
        {
            tagSection.Attributes.Add("id", TabStripName);
        }
        if (TabStripText.IsNotNullOrWhiteSpace())
        {
            var tagText = new TagBuilder("h2");
            tagText.SetInnerText(TabStripText);
            tagSection.InnerHtml += tagText.ToString();
        }
        if (!TabStripCollapsible)
        {
            tagSection.Attributes.Add("class", "collapsible");
            tagDiv.AddCssClass("collapsible-content");
            tagSection.InnerHtml += tagDiv;
        }
        if (ItemTabs!=null)
        {
            tagTab.AddCssClass("tabstrip");
            ItemTabs = tabs => tabs.Render();
            ItemTabs(new ItemTabs());
            tagTab.InnerHtml += ItemTabs;
        }
        new MvcHtmlString(tagTab.ToString());
        return new MvcHtmlString(tagSection.ToString());
    }
}

Метод Render собирает методы и рендерит Html код. Есть метод Items где должно рендерится количество табов в блоке div с классом tabstrip. Для реализации екстеншен методов в методе Items- создал класс ItemTabs

public class ItemTabs
{
    private string TriggersText { get; set; }
    private bool TriggerSelected { get; set; }
    private string TabContent { get; set; }
    private TagBuilder TagTrigger => new TagBuilder("div");
    private TagBuilder TagTab=> new TagBuilder("div");
    public ItemTabs Add()
    {
        TagTrigger.AddCssClass("trigger");
        return this;
    }
    public ItemTabs Text(string text)
    {
        TriggersText = text;
        TagTrigger.InnerHtml += TriggersText;
        return this;
    }
    public ItemTabs Selected(bool selected)
    {
        TriggerSelected = selected;
        TagTrigger.AddCssClass("active");
        return this;
    }
    public ItemTabs Content(string htmlString)
    {
        TabContent = htmlString;
        TagTab.AddCssClass("tab");
        TagTab.InnerHtml += TabContent;
        return this;
    }
    public void Render()
    {
        new MvcHtmlString(TagTrigger.ToString());
        new MvcHtmlString(TagTab.ToString());
    }
}

Проблема в том, что страница рендерится только до блока с классом collapsible-content- внутри этого блока больше ничего нету. Не могу разобраться!

READ ALSO
Использование базы данных в приложении winforms

Использование базы данных в приложении winforms

Есть толстый клиент написанный на winformsК нему подключена база данных mssql

210
BackgroundWorker для while

BackgroundWorker для while

Подскажите подойдет ли BackgroundWorker для такой цели :

215
Перечислить все поля и их значения C#

Перечислить все поля и их значения C#

Нужно для отладки прочитать название всех полей класса и их значенияНу например, имеется экземпляр класса dog

185