对存储库进行排序和分页
Sorting and Paging on repository
我有一个简单的 ASP.NET MVC 应用程序,它可以搜索、过滤和分页车辆制造商列表。我按照 youtube https://www.youtube.com/watch?v=srN56uxw76s
上 kudvenkat 的教程在控制器上实现了排序、过滤和分页(在 "Index" 操作上)
所以,这是我的 "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));
}
这是我的 "Index" 观点:
@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 class 如下:
public class VehicleDbContext : DbContext
{
public VehicleDbContext() : base("VehicleDbContext")
{
}
public DbSet<VehicleMake> VehicleMakes { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
一切正常,但现在我想在存储库中实现排序和分页,并将其从控制器中删除。参数应该通过 get/query 方法传递。我不确定该怎么做,如果有任何帮助,我将不胜感激。
您可以在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));
}
我有一个简单的 ASP.NET MVC 应用程序,它可以搜索、过滤和分页车辆制造商列表。我按照 youtube https://www.youtube.com/watch?v=srN56uxw76s
上 kudvenkat 的教程在控制器上实现了排序、过滤和分页(在 "Index" 操作上)所以,这是我的 "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));
}
这是我的 "Index" 观点:
@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 class 如下:
public class VehicleDbContext : DbContext
{
public VehicleDbContext() : base("VehicleDbContext")
{
}
public DbSet<VehicleMake> VehicleMakes { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
一切正常,但现在我想在存储库中实现排序和分页,并将其从控制器中删除。参数应该通过 get/query 方法传递。我不确定该怎么做,如果有任何帮助,我将不胜感激。
您可以在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));
}