我有一个简单的ASP.NET MVC应用程序,它可以搜索,过滤和分页车辆清单.我按照 kudvenkat 在youtube www.youtube/watch?v=srN56uxw76s
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 www.youtube/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)); }更多推荐
在存储库上排序和分页
发布评论