MVC Linq order不能在Razor视图中持久化

本文关键字:视图 持久化 Razor Linq order 不能 MVC | 更新日期: 2023-09-27 18:05:29

我在我的web项目中有一个部分视图,负责在导航菜单中显示项目。导航菜单项模型上有一个SortOrder属性,该属性负责显示它们出现的顺序。unsorted的默认值是0。因此,我需要按任何大于0的值排序,然后按未排序的菜单项的名称排序。问题是我的linq查询不尊重我的排序顺序。相反,它首先显示排序顺序值为0的项。我使用MVC 4与。net框架目标4.5。谢谢你的建议。

下面是我的代码:
@model IEnumerable<Models.Item>
@helper ShowItems(List<Models.Item> items)
{
<ul>
    @foreach(var item in items)
    {
        <li>
            @item.DisplayName
            @if(Model.Any(x => x.ParentId == item.Id))
            {
                @ShowItem(Model.Where(x => x.ParentId == item.Id).OrderBy(x => x.SortOrder.Value > 0).ThenBy(y => y.DisplayName).ToList())
            }
        </li>
    }
</ul>
}
@ShowItems(Model.Where(x => !x.ParentId.HasValue || x.ParentId.Value == 0).OrderBy(x => x.SortOrder.Value > 0).ThenBy(y => y.DisplayName).ToList());

MVC Linq order不能在Razor视图中持久化

OrderBy接受一个表达式,该表达式的值被求值,然后按结果值排序。所以在你的例子中x => x. sortorder . value> 0是一个布尔值计算-结果是true或false。我相信它等于0或1,所以排序时,假会排在真之前。任何带有SortOrder的东西。Value == 0将首先显示。你正在比较苹果和橙子(布尔值和整数)

试着像这样把橙子映射到苹果:

OrderBy(x => x.SortOrder.Value > 0 ? 0 : 1).ThenBy(...);

现在你先按整数排序,然后按整数排序,而不是按布尔值排序,然后按整数排序。

使用orderby降序并按x.SortOrder.Value排序

@ShowItems(Model.Where(x => !x.ParentId.HasValue || x.ParentId.Value == 0)
.OrderByDescending(x => x.SortOrder.Value)
.ThenBy(y => y.DisplayName).ToList());

这将按照SortOrder字段的升序给出您的列表,例外的是末尾为零:

OrderBy(x => x.SortOrder.Value == 0 ? Int32.MaxValue : x.SortOrder.Value)