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);
}