Продолжение темы 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- внутри этого блока больше ничего нету. Не могу разобраться!
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть толстый клиент написанный на winformsК нему подключена база данных mssql
Нужно для отладки прочитать название всех полей класса и их значенияНу например, имеется экземпляр класса dog
У меня есть такой метод: