asp.net-mvc - ASP.NET MVC : Custom Sorting

标签 asp.net-mvc sorting entity-framework-6

我正在尝试在我的小型 asp.net mvc 应用程序中实现自定义排序。嗯,有很多可用的插件。但这次我想自己做。

这是我的表格标题:

 <tr>
    <th>
        S.No.
    </th>
    <th>
        @Html.ActionLink("UrlTitle", "Index", new { SortOrder = ViewBag.SortOrder == null ? "Asc" : (ViewBag.SortOrder == "Asc"? "Desc":"Asc"), SortBy = "UrlTitle" })
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Url)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.UrlDesc)
    </th>

    <th>
        @Html.DisplayNameFor(model => model.tbl_Category.CategoryName)
    </th>
</tr>

这就是操作:

public ActionResult Index(String SortOrder, String SortBy)
    {
        ViewBag.SortOrder = SortOrder;
        ViewBag.SortBy = SortBy;

        var model = ObjBs.GetAll().Where(x=>x.IsApproved == "A");
        switch(SortOrder)
        {
            case "Asc":
                model = model.OrderBy(x => x.UrlTitle);
                break;
            case "Desc":
                model = model.OrderByDescending(x => x.UrlTitle);
                break;
        }
        return View(model);
    }

目前我可以按UrlTitle排序,没有问题。但是如果我也想按其他列排序,我写了这样的内容:

switch(SortBy)
        {
            case "UrlTitle":
                switch(SortOrder)
                {
                    case "Asc":
                        model = model.OrderBy(x => x.UrlTitle);
                        break;
                    case "Desc":
                        model = model.OrderByDescending(x => x.UrlTitle);
                        break;
                    default:
                        break;
                }
                break;

            case "Category":
                switch (SortOrder)
                {
                    case "Asc":
                        model = model.OrderBy(x => x.UrlTitle);
                        break;
                    case "Desc":
                        model = model.OrderByDescending(x => x.UrlTitle);
                        break;
                    default:
                        break;
                }
                break;

            case "URL":
                switch (SortOrder)
                {
                    case "Asc":
                        model = model.OrderBy(x => x.UrlTitle);
                        break;
                    case "Desc":
                        model = model.OrderByDescending(x => x.UrlTitle);
                        break;
                    default:
                        break;
                }
                break;

            default:
                break;
        }

既然我可以通过参数传递列名,而不是编写嵌套开关,我不能做这样的事情吗:

    model = model.OrderBy(x => x.SortBy); Or, model = model.OrderBy(SortBy);

嗯,我认为当程序运行时,SortBy 的值将是columnName。但这似乎不起作用。

我只是不想重复写类似的代码。我怎样才能最大限度地减少它或使其变得更好?

最佳答案

如果你不想走反射路线,你应该可以使用 dynamic Linq供您查询。

关于asp.net-mvc - ASP.NET MVC : Custom Sorting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37246041/

相关文章:

c++ - 关于搜索和排序算法的问题

asp.net-mvc - UserManager.Create(用户,密码)抛出 EntityValidationError 说 Id 是必需的?

c# - EF6 : Mapping to ViewModel Reusability

asp.net - 当 url 导致临时重定向 (http 302) 时,索引的内容是什么?

javascript - 使用 Ajax 将复杂对象数组从 View 传递到 Controller

c# - ASP.Net MVC 4 EditorFor DateTime 未在 Chrome 中预填充

algorithm - 从大列表中获取最大的 n 个元素时应该使用哪种算法?

javascript - 如果将项目放入数组并排序,则确定项目的潜在索引。

entity-framework - 将 EF6 与 ASP.NET Core 结合使用

javascript - ASP.NET MVC 4 JS 缩小错误