Use IHtmlGenerator / TagBuilder in necessary tag helpers

Notes:
- Would be nice to completely remove the use of `AbpTagHelperService.RenderHtml`
pull/5331/head
Maik Stegemann 5 years ago
parent a352bbda8f
commit dd355c093a

@ -53,7 +53,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers
return Task.CompletedTask;
}
protected string RenderHtml(IHtmlContent content)
protected virtual string RenderHtml(IHtmlContent content)
{
using (var writer = new StringWriter())
{

@ -1,8 +1,8 @@
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Breadcrumb
{
@ -10,37 +10,31 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Breadcrumb
{
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "nav";
output.Attributes.Add("aria-label", "breadcrumb");
var list = InitilizeFormGroupContentsContext(context, output);
await output.GetChildContentAsync();
SetInnerOlTag(context, output);
SetInnerList(context, output, list);
output.TagName = "nav";
output.Attributes.Add("aria-label", "breadcrumb");
}
protected virtual void SetInnerOlTag(TagHelperContext context, TagHelperOutput output)
{
output.PreContent.SetHtmlContent("<ol class=\"breadcrumb\">");
output.PostContent.SetHtmlContent("</ol>");
ProcessItems(context, output, list);
}
protected virtual void SetInnerList(TagHelperContext context, TagHelperOutput output, List<BreadcrumbItem> list)
protected virtual void ProcessItems(TagHelperContext context, TagHelperOutput output, List<BreadcrumbItem> list)
{
SetLastOneActiveIfThereIsNotAny(context, output, list);
var html = new StringBuilder("");
var listElement = new TagBuilder("ol");
listElement.AddCssClass("breadcrumb");
foreach (var breadcrumbItem in list)
{
var htmlPart = SetActiveClassIfActiveAndGetHtml(breadcrumbItem);
html.AppendLine(htmlPart);
listElement.InnerHtml.AppendHtml(htmlPart);
}
output.Content.SetHtmlContent(html.ToString());
output.Content.SetHtmlContent(listElement);
}
protected virtual List<BreadcrumbItem> InitilizeFormGroupContentsContext(TagHelperContext context, TagHelperOutput output)

@ -5,7 +5,6 @@ using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
@ -32,6 +31,8 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Carousel
await output.GetChildContentAsync();
SetOneItemAsActive(context, output, itemList);
SetItems(context, output, itemList);
SetControls(context, output, itemList);
SetIndicators(context, output, itemList);
@ -47,18 +48,17 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Carousel
protected virtual void SetItems(TagHelperContext context, TagHelperOutput output, List<CarouselItem> itemList)
{
var itemsHtml = new StringBuilder("");
itemsHtml.Append("<div class= \"carousel-inner\">");
var wrapper = new TagBuilder("div");
wrapper.AddCssClass("carousel-inner");
foreach (var carouselItem in itemList)
{
SetActiveIfActive(carouselItem);
itemsHtml.AppendLine(carouselItem.Html);
wrapper.InnerHtml.AppendHtml(carouselItem.Html);
}
itemsHtml.Append("</div>");
output.Content.SetHtmlContent(itemsHtml.ToString());
output.Content.SetHtmlContent(wrapper);
}
protected virtual void SetControls(TagHelperContext context, TagHelperOutput output, List<CarouselItem> itemList)

@ -1,8 +1,8 @@
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
@ -30,26 +30,21 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Collapse
await output.GetChildContentAsync();
var content = GetContent(items);
output.Content.SetHtmlContent(content);
ProcessItems(context, output, items);
}
protected virtual string GetContent(List<string> items)
protected virtual void ProcessItems(TagHelperContext context, TagHelperOutput output, List<string> items)
{
var html = new StringBuilder("");
foreach (var item in items)
{
var content = item.Replace(AbpAccordionParentIdPlaceholder, HtmlGenerator.Encode(TagHelper.Id));
html.AppendLine(
"<div class=\"card\">" + Environment.NewLine +
content
+ "</div>" + Environment.NewLine
);
}
var wrapper = new TagBuilder("div");
wrapper.AddCssClass("card");
wrapper.InnerHtml.AppendHtml(content);
return html.ToString();
output.Content.AppendHtml(wrapper);
}
}
protected virtual List<string> InitilizeFormGroupContentsContext(TagHelperContext context, TagHelperOutput output)

@ -1,12 +1,13 @@
using System;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Extensions;
@ -249,7 +250,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{
if (IsOutputHidden(inputTag) || TagHelper.SuppressLabel)
{
return "";
return string.Empty;
}
if (string.IsNullOrEmpty(TagHelper.Label))
@ -257,11 +258,16 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
return await GetLabelAsHtmlUsingTagHelperAsync(context, output, isCheckbox) + GetRequiredSymbol(context, output);
}
var checkboxClass = isCheckbox ? "class=\"custom-control-label\" " : "";
var label = new TagBuilder("label");
label.Attributes.Add("for", GetIdAttributeValue(inputTag));
label.InnerHtml.Append(TagHelper.Label);
if (isCheckbox)
{
label.AddCssClass("custom-control-label");
}
return "<label " + checkboxClass + GetIdAttributeAsString(inputTag) + ">"
+ TagHelper.Label +
"</label>" + GetRequiredSymbol(context, output);
return RenderHtml(label);
}
protected virtual string GetRequiredSymbol(TagHelperContext context, TagHelperOutput output)
@ -308,9 +314,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
var idAttr = inputTag.Attributes.FirstOrDefault(a => a.Name == "id");
var localizedText = _tagHelperLocalizer.GetLocalizedText(text, TagHelper.AspFor.ModelExplorer);
return "<small id=\"" + idAttr?.Value + "InfoText\" class=\"form-text text-muted\">" +
localizedText +
"</small>";
var small = new TagBuilder("small");
small.Attributes.Add("id", idAttr?.Value?.ToString() + "InfoText");
small.AddCssClass("form-text text-muted");
return RenderHtml(small);
}
protected virtual async Task<string> GetLabelAsHtmlUsingTagHelperAsync(TagHelperContext context, TagHelperOutput output, bool isCheckbox)
@ -426,11 +434,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
return inputTag.Attributes.Any(a => a.Name.ToLowerInvariant() == "type" && a.Value.ToString().ToLowerInvariant() == "hidden");
}
protected virtual string GetIdAttributeAsString(TagHelperOutput inputTag)
protected virtual string GetIdAttributeValue(TagHelperOutput inputTag)
{
var idAttr = inputTag.Attributes.FirstOrDefault(a => a.Name == "id");
return idAttr != null ? "for=\"" + idAttr.Value + "\"" : "";
return idAttr != null ? idAttr.Value.ToString() : string.Empty;
}
protected virtual void AddGroupToFormGroupContents(TagHelperContext context, string propertyName, string html, int order, out bool suppress)

@ -1,12 +1,12 @@
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Localization;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Extensions;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
@ -53,15 +53,35 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
var inlineClass = (TagHelper.Inline ?? false) ? " custom-control-inline" : "";
var id = TagHelper.AspFor.Name + "Radio" + selectItem.Value;
var name = TagHelper.AspFor.Name;
var selected = selectItem.Selected ? " checked=\"checked\"" : "";
var disabled = (TagHelper.Disabled??false) ? " disabled" : "";
var htmlPart = "<div class=\"custom-control custom-radio" + inlineClass + "\">\r\n" +
" <input type=\"radio\" id=\"" + id + "\" name=\"" + name + "\" value=\"" + selectItem.Value + "\"" + selected + " class=\"custom-control-input\""+ disabled + ">\r\n" +
" <label class=\"custom-control-label\" for=\"" + id + "\">" + selectItem.Text + "</label>\r\n" +
"</div>";
var input = new TagBuilder("input");
input.AddCssClass("custom-control-input");
input.Attributes.Add("type", "radio");
input.Attributes.Add("id", id);
input.Attributes.Add("name", name);
input.Attributes.Add("value", selectItem.Value);
if (selectItem.Selected)
{
input.Attributes.Add("checked", "checked");
}
if (TagHelper.Disabled ?? false)
{
input.Attributes.Add("disabled", "disabled");
}
var label = new TagBuilder("label");
label.AddCssClass("custom-control-label");
label.Attributes.Add("for", id);
label.InnerHtml.Append(selectItem.Text);
var wrapper = new TagBuilder("div");
wrapper.AddCssClass("custom-control custom-radio" + inlineClass);
wrapper.InnerHtml.AppendHtml(input);
wrapper.InnerHtml.AppendHtml(label);
html.AppendLine(htmlPart);
html.AppendLine(RenderHtml(wrapper));
}
return html.ToString();

@ -1,20 +1,18 @@
using System;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Localization;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Extensions;
using Volo.Abp.DynamicProxy;
using Volo.Abp.Localization;
using Volo.Abp.Reflection;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{
@ -140,7 +138,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
{
if (!string.IsNullOrEmpty(TagHelper.Label))
{
return "<label " + GetIdAttributeAsString(selectTag) + ">" + TagHelper.Label + "</label>" + GetRequiredSymbol(context, output);
var label = new TagBuilder("label");
label.Attributes.Add("for", GetIdAttributeValue(selectTag));
label.InnerHtml.Append(TagHelper.Label);
return RenderHtml(label) + GetRequiredSymbol(context, output);
}
return await GetLabelAsHtmlUsingTagHelperAsync(context, output) + GetRequiredSymbol(context, output);
@ -199,9 +201,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
var idAttr = inputTag.Attributes.FirstOrDefault(a => a.Name == "id");
var localizedText = _tagHelperLocalizer.GetLocalizedText(text, TagHelper.AspFor.ModelExplorer);
return "<small id=\"" + idAttr?.Value + "InfoText\" class=\"form-text text-muted\">" +
localizedText +
"</small>";
var small = new TagBuilder("small");
small.Attributes.Add("id", idAttr?.Value?.ToString() + "InfoText");
small.AddCssClass("form-text text-muted");
return RenderHtml(small);
}
protected virtual List<SelectListItem> GetSelectItemsFromEnum(TagHelperContext context, TagHelperOutput output, ModelExplorer explorer)
@ -338,11 +342,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form
}
}
protected virtual string GetIdAttributeAsString(TagHelperOutput inputTag)
protected virtual string GetIdAttributeValue(TagHelperOutput inputTag)
{
var idAttr = inputTag.Attributes.FirstOrDefault(a => a.Name == "id");
return idAttr != null ? "for=\"" + idAttr.Value + "\"" : "";
return idAttr != null ? idAttr.Value.ToString() : string.Empty;
}
protected virtual void AddGroupToFormGroupContents(TagHelperContext context, string propertyName, string html, int order, out bool suppress)

@ -33,26 +33,26 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
switch (TagHelper.Buttons)
{
case AbpModalButtons.Cancel:
output.PostContent.AppendHtml(GetCancelButton());
AddCancelButton(context, output);
break;
case AbpModalButtons.Close:
output.PostContent.AppendHtml(GetCloseButton());
AddCloseButton(context, output);
break;
case AbpModalButtons.Save:
output.PostContent.AppendHtml(GetSaveButton());
AddSaveButton(context, output);
break;
case AbpModalButtons.Save | AbpModalButtons.Cancel:
output.PostContent.AppendHtml(GetSaveButton());
output.PostContent.AppendHtml(GetCancelButton());
AddSaveButton(context, output);
AddCancelButton(context, output);
break;
case AbpModalButtons.Save | AbpModalButtons.Close:
output.PostContent.AppendHtml(GetSaveButton());
output.PostContent.AppendHtml(GetCloseButton());
AddSaveButton(context, output);
AddCloseButton(context, output);
break;
}
}
protected virtual string GetSaveButton()
protected virtual void AddSaveButton(TagHelperContext context, TagHelperOutput output)
{
var icon = new TagBuilder("i");
icon.AddCssClass("fa");
@ -69,10 +69,10 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
button.InnerHtml.AppendHtml(icon);
button.InnerHtml.AppendHtml(span);
return RenderHtml(button);
output.PostContent.AppendHtml(button);
}
protected virtual string GetCloseButton()
protected virtual void AddCloseButton(TagHelperContext context, TagHelperOutput output)
{
var button = new TagBuilder("button");
button.Attributes.Add("type", "button");
@ -81,10 +81,10 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
button.AddCssClass("btn-secondary");
button.InnerHtml.Append(_localizer["Close"]);
return RenderHtml(button);
output.PostContent.AppendHtml(button);
}
protected virtual string GetCancelButton()
protected virtual void AddCancelButton(TagHelperContext context, TagHelperOutput output)
{
var button = new TagBuilder("button");
button.Attributes.Add("type", "button");
@ -93,7 +93,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
button.AddCssClass("btn-secondary");
button.InnerHtml.Append(_localizer["Cancel"]);
return RenderHtml(button);
output.PostContent.AppendHtml(button);
}
protected virtual void ProcessButtonsAlignment(TagHelperOutput output)

@ -1,38 +1,52 @@
using Microsoft.AspNetCore.Mvc.Rendering;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System.Text;
using Microsoft.Extensions.Localization;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
{
public class AbpModalHeaderTagHelperService : AbpTagHelperService<AbpModalHeaderTagHelper>
{
protected IStringLocalizer<AbpUiResource> L { get; }
public AbpModalHeaderTagHelperService(IStringLocalizer<AbpUiResource> localizer)
{
L = localizer;
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "div";
output.Attributes.AddClass("modal-header");
output.PreContent.SetHtmlContent(CreatePreContent());
output.PostContent.SetHtmlContent(CreatePostContent());
AddTitle(context, output);
AddCloseButton(context, output);
}
protected virtual string CreatePreContent()
protected virtual void AddTitle(TagHelperContext context, TagHelperOutput output)
{
var title = new TagBuilder("h5");
title.AddCssClass("modal-title");
title.InnerHtml.Append(TagHelper.Title);
return RenderHtml(title);
output.PreContent.SetHtmlContent(title);
}
protected virtual string CreatePostContent()
protected virtual void AddCloseButton(TagHelperContext context, TagHelperOutput output)
{
var sb = new StringBuilder();
sb.AppendLine(" <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">");
sb.AppendLine(" <span aria-hidden=\"true\">&times;</span>");
sb.AppendLine(" </button>");
var span = new TagBuilder("span");
span.Attributes.Add("aria-hidden", "true");
span.InnerHtml.AppendHtml("&times;");
var button = new TagBuilder("button");
button.AddCssClass("close");
button.Attributes.Add("type", "button");
button.Attributes.Add("data-dismiss", "modal");
button.Attributes.Add("aria-label", L["Close"].Value);
button.InnerHtml.AppendHtml(span);
return sb.ToString();
output.PostContent.AppendHtml(button);
}
}
}

@ -1,40 +1,53 @@
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
{
public class AbpModalTagHelperService : AbpTagHelperService<AbpModalTagHelper>
{
protected IHtmlGenerator HtmlGenerator { get; }
public AbpModalTagHelperService(IHtmlGenerator htmlGenerator)
{
HtmlGenerator = htmlGenerator;
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
output.TagName = null;
output.PreContent.SetHtmlContent(CreatePreContent(output));
output.PostContent.SetHtmlContent(CreatePostContent());
}
protected virtual string CreatePreContent(TagHelperOutput output)
{
var sb = new StringBuilder();
var childContent = await output.GetChildContentAsync();
var attritubutes = output.Attributes.Select(a => " " + HtmlGenerator.Encode(a.Name) + "=\"" + HtmlGenerator.Encode(a.Value) + "\" ").ToList();
var attritubutesAsJoin = string.Join(" ", attritubutes.ToArray());
sb.AppendLine("<div class=\"" + GetModalClasses() + "\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\" " + attritubutesAsJoin + GetDataAttributes() + ">");
sb.AppendLine(" <div class=\"" + GetModalDialogClasses() + "\" role=\"document\">");
sb.AppendLine(" <div class=\"" + GetModalContentClasses() + "\">");
return sb.ToString();
Process(context, output, childContent);
}
protected virtual void Process(TagHelperContext context, TagHelperOutput output, TagHelperContent content)
{
var modalContent = new TagBuilder("div");
modalContent.AddCssClass(GetModalContentClasses());
modalContent.InnerHtml.AppendHtml(content);
var modalDialog = new TagBuilder("div");
modalDialog.AddCssClass(GetModalDialogClasses());
modalDialog.Attributes.Add("role", "document");
modalDialog.InnerHtml.AppendHtml(modalContent);
var modal = new TagBuilder("div");
modal.AddCssClass(GetModalClasses());
modal.Attributes.Add("tabindex", "-1");
modal.Attributes.Add("role", "dialog");
modal.Attributes.Add("aria-hidden", "true");
foreach (var attr in output.Attributes)
{
modal.Attributes.Add(attr.Name, attr.Value.ToString());
}
if (TagHelper.Static == true)
{
modal.Attributes.Add("data-backdrop", "static");
}
modal.InnerHtml.AppendHtml(modalDialog);
output.Content.SetHtmlContent(modal);
}
protected virtual string GetModalClasses()
{
return "modal fade";
@ -63,25 +76,5 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
{
return "modal-content";
}
protected virtual string GetDataAttributes()
{
if (TagHelper.Static == true)
{
return "data-backdrop=\"static\" ";
}
return string.Empty;
}
protected virtual string CreatePostContent()
{
var sb = new StringBuilder();
sb.AppendLine(" </div>");
sb.AppendLine(" </div>");
sb.AppendLine("</div>");
return sb.ToString();
}
}
}

@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System.Linq;
@ -28,38 +29,51 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Popover
SetDisabled(context, output);
}
}
protected virtual void SetDisabled(TagHelperContext context, TagHelperOutput output)
{
var triggerAsHtml = TagHelper.Dismissible ?? false ? "data-trigger=\"focus\" " : "";
{
var triggerValue = TagHelper.Dismissible ?? false ? "focus" : "";
if (TagHelper.Hoverable ?? false)
{
if (triggerAsHtml.Contains("focus"))
if (triggerValue.Contains("focus"))
{
triggerAsHtml = triggerAsHtml.Replace("focus", "focus hover");
triggerValue = triggerValue.Replace("focus", "focus hover");
}
else
{
triggerAsHtml = "data-trigger=\"hover\" ";
triggerValue = "hover";
}
}
var dataPlacementAsHtml = "data-placement=\"" + GetDirectory().ToString().ToLowerInvariant() + "\" ";
}
var dataPlacement = GetDirectory().ToString().ToLowerInvariant();
// data-placement="default" with data-trigger="focus" causes Cannot read property 'indexOf' of undefined at computeAutoPlacement(bootstrap.bundle.js?_v=637146714627330435:2185) error
if (IsDismissibleOrHoverable() && GetDirectory() == PopoverDirectory.Default)
{
//dataPlacementAsHtml = string.Empty; //bootstrap default placement is right, abp's is top.
dataPlacementAsHtml = dataPlacementAsHtml.Replace("default", "top");
dataPlacement = dataPlacement.Replace("default", "top");
}
var titleAttribute = output.Attributes.FirstOrDefault(at => at.Name == "title");
var titleAsHtml = titleAttribute == null ? "" : "title=\"" + HtmlGenerator.Encode(titleAttribute.Value) + "\" ";
var preElementHtml = "<span tabindex=\"0\" class=\"d-inline-block\" " + titleAsHtml + triggerAsHtml + dataPlacementAsHtml + "data-toggle=\"popover\" data-content=\"" + HtmlGenerator.Encode(GetDataContent()) + "\">";
var postElementHtml = "</span>";
output.PreElement.SetHtmlContent(preElementHtml);
output.PostElement.SetHtmlContent(postElementHtml);
var span = new TagBuilder("span");
span.AddCssClass("d-inline-block");
span.Attributes.Add("tabindex", "0");
span.Attributes.Add("data-toggle", "popover");
span.Attributes.Add("data-content", GetDataContent());
span.Attributes.Add("data-trigger", triggerValue);
span.Attributes.Add("data-placement", dataPlacement);
if (titleAttribute != null)
{
span.Attributes.Add("title", titleAttribute.Value.ToString());
}
output.PreElement.SetHtmlContent(span.RenderStartTag());
output.PostElement.SetHtmlContent(span.RenderEndTag());
output.Attributes.Add("style", "pointer-events: none;");
}
protected virtual void SetDataTriggerIfDismissible(TagHelperContext context, TagHelperOutput output)
{
if (TagHelper.Dismissible ?? false)

@ -1,9 +1,11 @@
using System;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Grid;
@ -11,6 +13,13 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Tab
{
public class AbpTabsTagHelperService : AbpTagHelperService<AbpTabsTagHelper>
{
protected IHtmlGenerator HtmlGenerator { get; }
public AbpTabsTagHelperService(IHtmlGenerator htmlGenerator)
{
HtmlGenerator = htmlGenerator;
}
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
SetRandomNameIfNotProvided();
@ -61,31 +70,34 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Tab
var navClass = TagHelper.TabStyle == TabStyle.Tab ? " nav-tabs" : " nav-pills";
var verticalClass = GetVerticalPillClassIfVertical();
var surroundedHeaders = "<ul class=\"nav" + verticalClass + navClass + "\" id=\"" + id + "\" role=\"tablist\">" + Environment.NewLine +
headers +
"</ul>";
var listElement = new TagBuilder("ul");
listElement.AddCssClass("nav" + verticalClass + navClass);
listElement.Attributes.Add("id", id);
listElement.Attributes.Add("role", "tablist");
listElement.InnerHtml.AppendHtml(headers);
return surroundedHeaders;
return RenderHtml(listElement);
}
protected virtual string SurroundContents(TagHelperContext context, TagHelperOutput output, string contents)
{
var id = TagHelper.Name + "Content";
var surroundedContents = "<div class=\"tab-content\" id=\"" + id + "\">" + Environment.NewLine +
contents +
" </div>";
var wrapper = new TagBuilder("div");
wrapper.AddCssClass("tab-content");
wrapper.Attributes.Add("id", id);
wrapper.InnerHtml.AppendHtml(contents);
return surroundedContents;
return RenderHtml(wrapper);
}
protected virtual string PlaceInsideColumn(string contents, int columnSize)
{
var surroundedContents = "<div class=\"col-md-" + columnSize + "\">" + Environment.NewLine +
contents +
" </div>";
var wrapper = new TagBuilder("div");
wrapper.AddCssClass("col-md-" + columnSize);
wrapper.InnerHtml.AppendHtml(contents);
return surroundedContents;
return RenderHtml(wrapper);
}
protected virtual void PlaceInsideRow(TagHelperOutput output)
@ -213,7 +225,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Tab
protected virtual string SetTabItemNameIfNotProvided(string content, int index)
{
return content.Replace(TabItemNamePlaceHolder, TagHelper.Name + "_" + index);
return content.Replace(TabItemNamePlaceHolder, HtmlGenerator.Encode(TagHelper.Name) + "_" + index);
}
}
}

@ -1,19 +1,11 @@
using System;
using System.Linq;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System.Linq;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Tooltip
{
public class AbpTooltipTagHelperService : AbpTagHelperService<AbpTooltipTagHelper>
{
protected IHtmlGenerator HtmlGenerator { get; }
public AbpTooltipTagHelperService(IHtmlGenerator htmlGenerator)
{
HtmlGenerator = htmlGenerator;
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
if (IsButtonDisabled(context, output))
@ -32,12 +24,16 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Tooltip
var directory = GetDirectory() != TooltipDirectory.Default ? GetDirectory() : TooltipDirectory.Top;
output.Attributes.Add("data-placement", directory.ToString().ToLowerInvariant());
output.PreElement.SetHtmlContent(
"<span class=\"d-inline-block\" tabindex=\"0\" data-toggle=\"tooltip\" " +
"data-placement=\"" + HtmlGenerator.Encode(directory.ToString().ToLowerInvariant()) +
"\" title=\"" + HtmlGenerator.Encode(GetTitle()) + "\">" + Environment.NewLine);
var span = new TagBuilder("span");
span.AddCssClass("d-inline-block");
span.Attributes.Add("tabindex", "0");
span.Attributes.Add("data-toggle", "tooltip");
span.Attributes.Add("data-placement", directory.ToString().ToLowerInvariant());
span.Attributes.Add("title", GetTitle());
output.PreElement.SetHtmlContent(span.RenderStartTag());
output.PostElement.SetHtmlContent(Environment.NewLine + "</span>");
output.PostElement.SetHtmlContent(span.RenderEndTag());
output.Attributes.Add("style", "pointer-events: none;");
}

Loading…
Cancel
Save