Umbraco Razor中含数字的地址字符串排序异常问题求助
解决Umbraco中地址带数字的自然排序问题
当前排序逻辑是按纯字符串字典序比较,所以"14"会排在"2"前面——因为字符串比较是逐字符对比,'1'的ASCII值小于'2',导致不符合预期的排序结果。
如果你使用的是.NET 5及以上版本(对应Umbraco 9+),可以直接利用内置的数字排序选项实现自然排序,无需拆分字符串提取数字:
- 首先引入必要的命名空间:
@using System.Globalization
- 修改Razor排序代码,在
ThenBy中指定带数字排序选项的字符串比较器:
var apartments = Umbraco.Content(Guid.Parse("f3c9c894-16e5-491e-b39f-77bf2cb13c6f")) .ChildrenOfType("ApartmentItem") .Where(x => x.IsVisible()) .OrderBy(x => x.Value("apartmentItemStatus").ToString().Replace(" ", "")) .ThenBy(x => x.Name.ToString().Replace(" ", ""), StringComparer.Create(CultureInfo.CurrentCulture, CompareOptions.NumericOrder));
CompareOptions.NumericOrder会让比较器将字符串中的数字片段视为数值而非单个字符,这样就能得到你预期的排序结果:
- Street Road 2
- Street Road 14
- Street Road 22b
如果你的项目基于.NET Framework(Umbraco 8及以下),CompareOptions.NumericOrder不可用,这种情况下要完全避免拆分字符串的话,可借助第三方自然排序库(比如NaturalSort.Extension),通过NuGet安装后使用对应的比较器:
// 安装后引入命名空间 @using NaturalSort.Extension // 修改排序逻辑 var apartments = Umbraco.Content(Guid.Parse("f3c9c894-16e5-491e-b39f-77bf2cb13c6f")) .ChildrenOfType("ApartmentItem") .Where(x => x.IsVisible()) .OrderBy(x => x.Value("apartmentItemStatus").ToString().Replace(" ", "")) .ThenBy(x => x.Name.ToString().Replace(" ", ""), StringComparer.OrdinalIgnoreCase.WithNaturalSort());
内容的提问来源于stack exchange,提问作者Morten Hagh
相关产品推荐
相关产品推荐

