add redirect helper on pagemodel; fix href bug in app-active tag helper

This commit is contained in:
2026-03-17 11:53:13 +01:00
parent 865d3e2b61
commit 4ddb11b347
2 changed files with 37 additions and 16 deletions
+22 -3
View File
@@ -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 Microsoft.Extensions.DependencyInjection;
using zero.Metadata; using zero.Metadata;
@@ -9,17 +11,34 @@ public abstract class ZeroPageModel : PageModel
/// <summary> /// <summary>
/// Get access to the zero context for this request /// Get access to the zero context for this request
/// </summary> /// </summary>
public IZeroContext ZeroContext => _zeroContext ?? (_zeroContext = HttpContext?.RequestServices?.GetService<IZeroContext>()); public IZeroContext ZeroContext => _zeroContext ??= HttpContext?.RequestServices?.GetService<IZeroContext>();
IZeroContext _zeroContext; IZeroContext _zeroContext;
/// <summary> /// <summary>
/// Get access to the localizer /// Get access to the localizer
/// </summary> /// </summary>
public ILocalizer Localizer => _localizer ?? (_localizer = HttpContext?.RequestServices?.GetService<ILocalizer>()); public ILocalizer Localizer => _localizer ??= HttpContext?.RequestServices?.GetService<ILocalizer>();
ILocalizer _localizer; ILocalizer _localizer;
/// <summary> /// <summary>
/// Set metadata for this page /// Set metadata for this page
/// </summary> /// </summary>
public MetadataOptions Metadata { get; protected set; } = new(); public MetadataOptions Metadata { get; protected set; } = new();
/// <summary>
/// Redirect to the current page with the same query string and an optional URL suffix
/// </summary>
public IActionResult RedirectToSelf(string suffix = null)
{
return Redirect(CurrentUrl(suffix));
}
/// <summary>
/// Get current URL as string with an optional URL suffix
/// </summary>
public string CurrentUrl(string suffix = null)
{
string rawUrl = Request.GetEncodedPathAndQuery();
return rawUrl + suffix.Or(string.Empty);
}
} }
+15 -13
View File
@@ -8,21 +8,21 @@ namespace zero.TagHelpers;
[HtmlTargetElement(Attributes = "app-active")] [HtmlTargetElement(Attributes = "app-active")]
public class ActiveTagHelper(IHttpContextAccessor contextAccessor) : TagHelper 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) public override void Process(TagHelperContext context, TagHelperOutput output)
{ {
string href = output.Attributes["href"]?.Value?.ToString();
output.Attributes.RemoveAll("app-active"); 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); output.AddClass("is-active", HtmlEncoder.Default);
} }
if (contextAccessor.HttpContext.IsUrl(Href)) if (contextAccessor.HttpContext.IsUrl(href))
{ {
output.AddClass("is-active-exact", HtmlEncoder.Default); output.AddClass("is-active-exact", HtmlEncoder.Default);
} }
@@ -33,15 +33,17 @@ public class ActiveTagHelper(IHttpContextAccessor contextAccessor) : TagHelper
[HtmlTargetElement(Attributes = "app-active-exact")] [HtmlTargetElement(Attributes = "app-active-exact")]
public class ActiveExactTagHelper(IHttpContextAccessor contextAccessor) : TagHelper public class ActiveExactTagHelper(IHttpContextAccessor contextAccessor) : TagHelper
{ {
[HtmlAttributeName("href")]
public string Href { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output) public override void Process(TagHelperContext context, TagHelperOutput output)
{ {
string href = output.Attributes["href"]?.Value?.ToString();
output.Attributes.RemoveAll("app-active-exact"); 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); output.AddClass("is-active-exact", HtmlEncoder.Default);
} }