From cdfe6168b89b8c0e54ed8fc841475e65174e851f Mon Sep 17 00:00:00 2001 From: Brian Lagunas <835562+brianlagunas@users.noreply.github.com> Date: Fri, 27 Mar 2026 21:29:20 -0600 Subject: [PATCH] unescape view names in region navigation Ensures that view names containing diacritics, such as umlauts, are correctly resolved by unescaping the URI path during region navigation. --- .../RegionNavigationContentLoader.cs | 2 +- .../Regions/RegionNavigationContentLoader.cs | 2 +- .../Common/UriParsingHelperFixture.cs | 23 +++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/Maui/Prism.Maui/Navigation/Regions/Navigation/RegionNavigationContentLoader.cs b/src/Maui/Prism.Maui/Navigation/Regions/Navigation/RegionNavigationContentLoader.cs index 3a100b18e..a28579c29 100644 --- a/src/Maui/Prism.Maui/Navigation/Regions/Navigation/RegionNavigationContentLoader.cs +++ b/src/Maui/Prism.Maui/Navigation/Regions/Navigation/RegionNavigationContentLoader.cs @@ -91,7 +91,7 @@ protected virtual string GetContractFromNavigationContext(NavigationContext navi var candidateTargetContract = UriParsingHelper.EnsureAbsolute(navigationContext.Uri).AbsolutePath; candidateTargetContract = candidateTargetContract.TrimStart('/'); - return candidateTargetContract; + return Uri.UnescapeDataString(candidateTargetContract); } /// diff --git a/src/Wpf/Prism.Wpf/Navigation/Regions/RegionNavigationContentLoader.cs b/src/Wpf/Prism.Wpf/Navigation/Regions/RegionNavigationContentLoader.cs index 3d82030c8..0a629e3b9 100644 --- a/src/Wpf/Prism.Wpf/Navigation/Regions/RegionNavigationContentLoader.cs +++ b/src/Wpf/Prism.Wpf/Navigation/Regions/RegionNavigationContentLoader.cs @@ -125,7 +125,7 @@ protected virtual string GetContractFromNavigationContext(NavigationContext navi var candidateTargetContract = UriParsingHelper.GetAbsolutePath(navigationContext.Uri); candidateTargetContract = candidateTargetContract.TrimStart('/'); - return candidateTargetContract; + return Uri.UnescapeDataString(candidateTargetContract); } /// diff --git a/tests/Maui/Prism.Maui.Tests/Fixtures/Common/UriParsingHelperFixture.cs b/tests/Maui/Prism.Maui.Tests/Fixtures/Common/UriParsingHelperFixture.cs index 2327ac37f..9e3b00f3a 100644 --- a/tests/Maui/Prism.Maui.Tests/Fixtures/Common/UriParsingHelperFixture.cs +++ b/tests/Maui/Prism.Maui.Tests/Fixtures/Common/UriParsingHelperFixture.cs @@ -232,4 +232,27 @@ public void ParseForDeepLinkRelativeUri() Assert.Equal(_deepLinkRelativeUri, uri.OriginalString); Assert.False(uri.IsAbsoluteUri); } + + [Theory] + [InlineData("TestäöüView")] + [InlineData("MøbëlList")] + [InlineData("Ñoño")] + public void GetAbsolutePathUnescapesDiacritics(string viewName) + { + var uri = UriParsingHelper.Parse(viewName); + var absolutePath = UriParsingHelper.GetAbsolutePath(uri); + var result = Uri.UnescapeDataString(absolutePath.TrimStart('/')); + Assert.Equal(viewName, result); + } + + [Theory] + [InlineData("TestäöüView")] + [InlineData("MøbëlList")] + public void GetUriSegmentsUnescapesDiacritics(string viewName) + { + var uri = new Uri(viewName, UriKind.Relative); + var segments = UriParsingHelper.GetUriSegments(uri); + var segmentName = UriParsingHelper.GetSegmentName(segments.Dequeue()); + Assert.Equal(viewName, segmentName); + } }