diff --git a/zero/Mvc/ZeroPageModel.cs b/zero/Mvc/ZeroPageModel.cs index 20a5df52..7949502b 100644 --- a/zero/Mvc/ZeroPageModel.cs +++ b/zero/Mvc/ZeroPageModel.cs @@ -1,4 +1,6 @@ -using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; using zero.Metadata; @@ -9,17 +11,34 @@ public abstract class ZeroPageModel : PageModel /// /// Get access to the zero context for this request /// - public IZeroContext ZeroContext => _zeroContext ?? (_zeroContext = HttpContext?.RequestServices?.GetService()); + public IZeroContext ZeroContext => _zeroContext ??= HttpContext?.RequestServices?.GetService(); IZeroContext _zeroContext; /// /// Get access to the localizer /// - public ILocalizer Localizer => _localizer ?? (_localizer = HttpContext?.RequestServices?.GetService()); + public ILocalizer Localizer => _localizer ??= HttpContext?.RequestServices?.GetService(); ILocalizer _localizer; /// /// Set metadata for this page /// public MetadataOptions Metadata { get; protected set; } = new(); + + /// + /// Redirect to the current page with the same query string and an optional URL suffix + /// + public IActionResult RedirectToSelf(string suffix = null) + { + return Redirect(CurrentUrl(suffix)); + } + + /// + /// Get current URL as string with an optional URL suffix + /// + public string CurrentUrl(string suffix = null) + { + string rawUrl = Request.GetEncodedPathAndQuery(); + return rawUrl + suffix.Or(string.Empty); + } } \ No newline at end of file diff --git a/zero/TagHelpers/ActiveTagHelper.cs b/zero/TagHelpers/ActiveTagHelper.cs index 5bcebf7d..8d663399 100644 --- a/zero/TagHelpers/ActiveTagHelper.cs +++ b/zero/TagHelpers/ActiveTagHelper.cs @@ -8,21 +8,21 @@ namespace zero.TagHelpers; [HtmlTargetElement(Attributes = "app-active")] public class ActiveTagHelper(IHttpContextAccessor contextAccessor) : TagHelper { - [HtmlAttributeName("href")] - public string Href { get; set; } - - public override int Order { get; } = 100; - - public override void Process(TagHelperContext context, TagHelperOutput output) { + string href = output.Attributes["href"]?.Value?.ToString(); + output.Attributes.RemoveAll("app-active"); - if (contextAccessor.HttpContext.IsPartOfUrl(Href)) + if (href == null) + { + return; + } + if (contextAccessor.HttpContext.IsPartOfUrl(href)) { output.AddClass("is-active", HtmlEncoder.Default); } - if (contextAccessor.HttpContext.IsUrl(Href)) + if (contextAccessor.HttpContext.IsUrl(href)) { output.AddClass("is-active-exact", HtmlEncoder.Default); } @@ -33,15 +33,17 @@ public class ActiveTagHelper(IHttpContextAccessor contextAccessor) : TagHelper [HtmlTargetElement(Attributes = "app-active-exact")] public class ActiveExactTagHelper(IHttpContextAccessor contextAccessor) : TagHelper { - [HtmlAttributeName("href")] - public string Href { get; set; } - - public override void Process(TagHelperContext context, TagHelperOutput output) { + string href = output.Attributes["href"]?.Value?.ToString(); + output.Attributes.RemoveAll("app-active-exact"); - if (contextAccessor.HttpContext.IsUrl(Href)) + if (href == null) + { + return; + } + if (contextAccessor.HttpContext.IsUrl(href)) { output.AddClass("is-active-exact", HtmlEncoder.Default); }