Продолжение темы 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- внутри этого блока больше ничего нету. Не могу разобраться!
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть толстый клиент написанный на winformsК нему подключена база данных mssql
Нужно для отладки прочитать название всех полей класса и их значенияНу например, имеется экземпляр класса dog
У меня есть такой метод: