【问题标题】:Sorting and Paging on repository对存储库进行排序和分页
【发布时间】:2018-04-15 11:21:33
【问题描述】:

我有一个简单的 ASP.NET MVC 应用程序,它可以搜索、过滤和分页车辆制造列表。我按照 youtube https://www.youtube.com/watch?v=srN56uxw76s

kudvenkat 的教程在控制器上实现了排序、过滤和分页(在“索引”操作上)

所以,这是我的“VehicleMakeController”和“Index”操作:

 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”:

public class VehicleRepository : IVehicleRepository
{

private readonly VehicleDbContext _context;


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

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

}

这是我的“IVehicleRepository”界面:

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

我的 DbContext 类如下:

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

}

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

}
}

这一切正常,但现在我想在存储库中实现排序和分页并将其从控制器中删除。参数应通过 get/query 方法传递。我不知道该怎么做,如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: asp.net-mvc sorting repository-pattern paging


    【解决方案1】:

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

    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));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多