From 4ddb11b3471944a3e7fbb610b452eb7cd3a325f2 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Tue, 17 Mar 2026 11:53:13 +0100 Subject: [PATCH] add redirect helper on pagemodel; fix href bug in app-active tag helper --- zero/Mvc/ZeroPageModel.cs | 25 ++++++++++++++++++++++--- zero/TagHelpers/ActiveTagHelper.cs | 28 +++++++++++++++------------- 2 files changed, 37 insertions(+), 16 deletions(-) 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); }