From 4ef12ce926bc19fbfae5eb24fe363ec944c04e0c Mon Sep 17 00:00:00 2001 From: Reijer van Oorspronk Date: Mon, 19 Jul 2021 10:58:51 +0200 Subject: [PATCH 1/2] - Added id to checkbox - Added possibility to use HtmlFieldPrefix on output --- .../FlagsEnumInputTagHelper.cs | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/Sakura.AspNetCore.Extensions/Sakura.AspNetCore.Mvc.TagHelpers/FlagsEnumInputTagHelper.cs b/Sakura.AspNetCore.Extensions/Sakura.AspNetCore.Mvc.TagHelpers/FlagsEnumInputTagHelper.cs index aa310a8..1e19235 100644 --- a/Sakura.AspNetCore.Extensions/Sakura.AspNetCore.Mvc.TagHelpers/FlagsEnumInputTagHelper.cs +++ b/Sakura.AspNetCore.Extensions/Sakura.AspNetCore.Mvc.TagHelpers/FlagsEnumInputTagHelper.cs @@ -1,5 +1,6 @@ using System; using JetBrains.Annotations; +using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.TagHelpers; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; @@ -26,9 +27,10 @@ public class FlagsEnumInputTagHelper : TagHelper /// Creates a new . /// [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] - public FlagsEnumInputTagHelper(IHtmlGenerator htmlGenerator) + public FlagsEnumInputTagHelper(IHtmlGenerator htmlGenerator, IHtmlHelper htmlHelper) { HtmlGenerator = htmlGenerator; + HtmlHelper = htmlHelper; } /// @@ -43,6 +45,18 @@ public FlagsEnumInputTagHelper(IHtmlGenerator htmlGenerator) [PublicAPI] protected IHtmlGenerator HtmlGenerator { get; } + /// + /// The Service object. + /// + [PublicAPI] + protected IHtmlHelper HtmlHelper { get; } + + /// + /// The Service object. + /// + [ViewContext] + protected ViewContext ViewContext { get; set; } + /// /// Get or set the model expression to retrieve the enum flag value from model. /// @@ -74,19 +88,31 @@ public override void Process(TagHelperContext context, TagHelperOutput output) throw new InvalidOperationException( $"The model expression type must be enum flag when {EnumFlagValueAttributeName} is specified"); - // Get base type and remove nullable var type = EnumFlagFor.ModelExplorer.ModelType; type = Nullable.GetUnderlyingType(type) ?? type; + ((IViewContextAware) HtmlHelper).Contextualize(ViewContext); + // Get the defined enum name var enumName = Enum.GetName(type, EnumFlagValue); if (enumName == null) throw new InvalidOperationException( $"The value of the {EnumFlagValueAttributeName} attribute is not a valid enum flag item."); + + // Now you can use the HtmlFieldPrefix if set + var name = ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix; + if (!string.IsNullOrEmpty(name)) + { + name += "."; + } + + name += EnumFlagFor.Name; + // Set name and value - output.Attributes.SetAttribute("name", EnumFlagFor.Name); + output.Attributes.SetAttribute("id", HtmlHelper.GenerateIdFromName($"{name}.{enumName}")); + output.Attributes.SetAttribute("name", name); output.Attributes.SetAttribute("value", enumName); // Set checked attribute From 10b76d5f15fb93791a01b6a10fa067f40e1c531c Mon Sep 17 00:00:00 2001 From: Reijer van Oorspronk Date: Mon, 19 Jul 2021 11:54:36 +0200 Subject: [PATCH 2/2] Added extra checks and made the ViewContext public --- .../FlagsEnumInputTagHelper.cs | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Sakura.AspNetCore.Extensions/Sakura.AspNetCore.Mvc.TagHelpers/FlagsEnumInputTagHelper.cs b/Sakura.AspNetCore.Extensions/Sakura.AspNetCore.Mvc.TagHelpers/FlagsEnumInputTagHelper.cs index 1e19235..823afd0 100644 --- a/Sakura.AspNetCore.Extensions/Sakura.AspNetCore.Mvc.TagHelpers/FlagsEnumInputTagHelper.cs +++ b/Sakura.AspNetCore.Extensions/Sakura.AspNetCore.Mvc.TagHelpers/FlagsEnumInputTagHelper.cs @@ -55,7 +55,7 @@ public FlagsEnumInputTagHelper(IHtmlGenerator htmlGenerator, IHtmlHelper htmlHel /// The Service object. /// [ViewContext] - protected ViewContext ViewContext { get; set; } + public ViewContext ViewContext { get; set; } /// /// Get or set the model expression to retrieve the enum flag value from model. @@ -92,26 +92,33 @@ public override void Process(TagHelperContext context, TagHelperOutput output) var type = EnumFlagFor.ModelExplorer.ModelType; type = Nullable.GetUnderlyingType(type) ?? type; - ((IViewContextAware) HtmlHelper).Contextualize(ViewContext); - // Get the defined enum name var enumName = Enum.GetName(type, EnumFlagValue); if (enumName == null) throw new InvalidOperationException( $"The value of the {EnumFlagValueAttributeName} attribute is not a valid enum flag item."); - - // Now you can use the HtmlFieldPrefix if set - var name = ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix; - if (!string.IsNullOrEmpty(name)) + var name = ""; + if (ViewContext != null) { - name += "."; + ((IViewContextAware)HtmlHelper).Contextualize(ViewContext); + + // Now you can use the HtmlFieldPrefix if set + name = ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix; + if (!string.IsNullOrEmpty(name)) + { + name += "."; + } } name += EnumFlagFor.Name; + // Set id if possible + if (ViewContext != null) + { + output.Attributes.SetAttribute("id", HtmlHelper.GenerateIdFromName($"{name}.{enumName}")); + } // Set name and value - output.Attributes.SetAttribute("id", HtmlHelper.GenerateIdFromName($"{name}.{enumName}")); output.Attributes.SetAttribute("name", name); output.Attributes.SetAttribute("value", enumName);