2017-11-02 10 views
0

私はシンプルなASP.NET MVCアプリケーションを用意しています。私はそうリポジトリの並べ替えとページング

https://www.youtube.com/watch?v=srN56uxw76sユーチューブ上の kudvenkatからチュートリアル以下(「インデックス」アクションで)コントローラのソート、フィルタリングやページングを実装し、これが私の「VehicleMakeController」であり、「インデックス」アクション:

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)); 
} 
私は、リポジトリのパターンを使用していると私はすべての車両を取得する方法は、データベースから作る「AllMakes」を持っているアプリケーションで

@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> 
} 

、これが私の「インデックス」の図です。 、

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

} 

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

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

} 
} 

このすべてがOKに動作しますので、これは私の "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クラスには、次のさ今はリポジトリに並べ替えとページングを実装し、それをコントローラから削除したいと考えています。パラメータは、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)); 
} 
関連する問題