在存储库上排序和分页 [英] Sorting and Paging on repository

查看:122
本文介绍了在存储库上排序和分页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的ASP.NET MVC应用程序,它可以搜索,过滤和分页车辆清单.我按照 kudvenkat 在youtube

I have a simple ASP.NET MVC application which has possibility to search, filter and page a list of vehicle makes. I implemented sorting, filtering and paging on controller (on "Index" action) following the tutorials from kudvenkat on youtube https://www.youtube.com/watch?v=srN56uxw76s

因此,这是我的"VehicleMakeController"和"Index"操作:

So, this is my "VehicleMakeController" and "Index" action:

 public class VehicleMakeController : Controller
{
    private readonly IVehicleRepository _vehicleRepository;

    public VehicleMakeController()
    {
        _vehicleRepository = new VehicleRepository(new VehicleDbContext());
    }

    // GET: VehicleMake
    public ActionResult Index(string search, int? page, string sort)
    {
        ViewBag.SortNameParameter = string.IsNullOrEmpty(sort) ? "Name desc" : "";

        var makes = _vehicleRepository.AllMakes;

        switch (sort)
        {
            case "Name desc":
                makes = makes.OrderByDescending(x => x.Name);
                break;
            default:
                makes = makes.OrderBy(x => x.Name);
                break;
        }

        if (search == null)
        {
            return View(makes.ToList().ToPagedList(page ?? 1, 5));
        }

        return View(makes.Where(x => x.Name.ToLower().StartsWith(search)).ToList().ToPagedList(page ?? 1, 5));
}

这是我的索引"视图:

@using PagedList;
@using PagedList.Mvc;
@model IPagedList<Project.Service.Entities.VehicleMake>

@{
ViewBag.Title = "Vehicle Makes";
}

<h2>@ViewBag.Title</h2>

@Html.ActionLink("Create", "CreateVehicleMake")

<br/>
<br/>

@using (@Html.BeginForm("Index", "VehicleMake", FormMethod.Get))
{
<p>
    @Html.TextBox("search") <input type="submit" value="Search"/>
</p>
}

<table class="table">
<thead>
<tr>
    <th>@Html.ActionLink("Name", "Index", new { sort = ViewBag.SortNameParameter, search = Request.QueryString["search"] })</th>
    <th></th>
</tr>
</thead>
<tbody>

@foreach (var vehicleMake in Model)
{
    <tr>
        <td>@vehicleMake.Name</td>
        <td>@Html.ActionLink("Edit", "EditVehicleMake", new {id = vehicleMake.Id})</td>
        <td>@Html.ActionLink("Delete", "DeleteVehicleMake", new {id = vehicleMake.Id})</td>
    </tr>
}
</tbody>
</table>

 @Html.PagedListPager(Model, page => Url.Action("Index", new { page,  search   = Request.QueryString["search"], sort = Request["sort"]}),
 new PagedListRenderOptions() { Display = PagedListDisplayMode.IfNeeded,   DisplayPageCountAndCurrentLocation = true})

@if (!Model.Any())
{
 <b>No rows match search criteria!</b>
}

在应用程序中,我使用的是存储库模式,并且我有"AllMakes"方法来从数据库中检索所有车辆制造商.因此,这是我的"VehicleRepository":

In application I'm using repository pattern and I have "AllMakes" method to retrieve all vehicle makes from database. So, this is my "VehicleRepository":

public class VehicleRepository : IVehicleRepository
{

private readonly VehicleDbContext _context;


public VehicleRepository(VehicleDbContext context)
{
    _context = context;
}

public IEnumerable<VehicleMake> AllMakes => _context.VehicleMakes;

}

这是我的"IVehicleRepository"界面:

and this is my "IVehicleRepository" interface:

public interface IVehicleRepository
{
IEnumerable<VehicleMake> AllMakes { get; }
}

我的DbContext类如下:

My DbContext class is following:

public class VehicleDbContext : DbContext
{
public VehicleDbContext() : base("VehicleDbContext")
{

}

public DbSet<VehicleMake> VehicleMakes { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

}
}

这一切正常,但是现在我想在存储库中实现排序和分页并将其从控制器中删除.参数应通过get/query方法传递.我不确定如何执行此操作,希望对您有所帮助.

This everything works OK, but now I want to implement sorting and paging in repository and remove it from controller. The parameters should be passed trough get/query method. I'm not sure how to do this and I would appreciate any help.

推荐答案

您可以在IVehicleRepository中声明一个函数并实现它.

You can declare a function in IVehicleRepository and implement it.

public interface IVehicleRepository
{
    IEnumerable<VehicleMake> AllMakes { get; }

    List<VehicleMake> GetVehicleWithPagination(string search, int? page, string sort);
}

public class VehicleRepository : IVehicleRepository
{

    // your old code

    public List<VehicleMake> GetVehicleWithPagination(string search, int? page, string sort)
    {
        // this is your code from controller 
        switch (sort)
        {
            case "Name desc":
                makes = AllMakes.OrderByDescending(x => x.Name);
                break;
            default:
                makes = AllMakes.OrderBy(x => x.Name);
                break;
        }

        if (search == null)
        {
            return AllMakes.ToList().ToPagedList(page ?? 1, 5);
        }
    }
}

还有您的控制器:

public ActionResult Index(string search, int? page, string sort)
{
    ViewBag.SortNameParameter = string.IsNullOrEmpty(sort) ? "Name desc" : "";
    return View(_vehicleRepository.GetVehicleWithPagination(search, page, sort));
}

这篇关于在存储库上排序和分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆