2017-11-02 1 views
0

나는 차량용 목록을 검색, 필터링 및 나열 할 수있는 간단한 ASP.NET MVC 응용 프로그램을 보유하고 있습니다.저장소에서 정렬 및 페이징

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)); 
} 
: 나는이 내 "VehicleMakeController"이고 "인덱스"조치 그래서

유튜브 https://www.youtube.com/watch?v=srN56uxw76s에 kudvenkat 에서 자습서 다음, 정렬 ("인덱스"행동에) 컨트롤러에 필터링 및 페이징 구현

는이 내 "인덱스"이다 : 응용 프로그램에서

@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) 
{ 

} 
} 

이 모든 것이 OK 작동, 하지만 지금 저장소에서 정렬 및 페이징을 구현하고 컨트롤러에서 제거하려고합니다. 매개 변수는 get/query 메소드를 통해 전달되어야합니다. 나는 이것을 어떻게하는지 모르겠다. 나는 어떤 도움에 감사 할 것이다.

답변

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