使用了LinqKit、PagedList.Mvc、EntityFramework 等DLL 直接使用nuget安装即可。
1.表模型:
using System.ComponentModel.DataAnnotations; namespace StoreDB.Models { public class t_bd_item_info { [Key] //主键 public string item_no { get; set; } public string item_name { get; set; } public decimal price { get; set; } //public DateTime? build_date { get; set; } } }
DbContext:
using StoreDB.Models; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; namespace StoreDB { public class StoreDbContext: DbContext { public StoreDbContext() : base("name=StoreDbContext") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //移除复数表名 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); base.OnModelCreating(modelBuilder); } public virtual DbSet<t_bd_item_info> t_bd_item_info { get; set; } } }
2.HomeController增加一个SearchIndex Action:
using LinqKit; using PagedList; using StoreDB; using StoreDB.Models; using System; using System.Linq; using System.Linq.Expressions; using System.Web.Mvc; namespace WebQueryAndPage.Controllers { public class HomeController : Controller { public ActionResult Index() { return Redirect("/Home/SearchIndex"); //return View(); } public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } public ActionResult SearchIndex(string ItemNo, string ItemName, int page = 1) { try { //为true 默认加载所有 Expression<Func<t_bd_item_info, bool>> where = PredicateBuilder.New<t_bd_item_info>(true); //动态拼接查询条件 if (!string.IsNullOrWhiteSpace(ItemNo)) { where = where.And(x => x.item_no == ItemNo); } if (!string.IsNullOrWhiteSpace(ItemName)) { where = where.And(x => x.item_name.Contains(ItemName)); } StoreDbContext dbContext = new StoreDbContext(); //直接ToPagedList,不要使用ToList var mylist = dbContext.t_bd_item_info.Where(where).OrderBy(x => x.item_no).ToPagedList(page, 10); return View(mylist); } catch (Exception ex) { return Content(ex.Message); } } } }
这里使用到了PredicateBuilder (LinqKit),来动态拼接查询条件。ToPagedList (PagedList)来分页。
3.为SearchIndex Action 增加一个视图SearchIndex.cshtml页面:
@*@model IEnumerable<StoreDB.Models.t_bd_item_info>*@ @model IPagedList<StoreDB.Models.t_bd_item_info> @using PagedList; @using PagedList.Mvc; @{ ViewBag.Title = "SearchIndex"; } <h2>SearchIndex</h2> @using (Html.BeginForm("SearchIndex", "Home", FormMethod.Get, new { id = "OrderForm" })) { <p> 货号: @Html.TextBox("ItemNo") 商品名称: @Html.TextBox("ItemName") <input type="submit" value="查询" /> </p> } <table class="table"> <tr> <th> 货号 </th> <th> 商品名称 </th> <th> @*@Html.DisplayNameFor(model => model.price)*@ 单价 </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.item_no) </td> <td> @Html.DisplayFor(modelItem => item.item_name) </td> <td> @Html.DisplayFor(modelItem => item.price) </td> <td> @*@Html.ActionLink("Edit", "Edit", new { id=item.item_no }) | @Html.ActionLink("Details", "Details", new { id=item.item_no }) | @Html.ActionLink("Delete", "Delete", new { id=item.item_no })*@ </td> </tr> } </table> @Html.PagedListPager(Model, page => Url.Action("SearchIndex", new { page, ItemNo = Request["ItemNo"], ItemName = Request["ItemName"] }))
从IEnumerable<StoreDB.Models.t_bd_item_info> 改成 IPagedList<StoreDB.Models.t_bd_item_info>,需要引用 @using PagedList;、@using PagedList.Mvc;
@Html.DisplayNameFor 无法使用,直接写名称。
底部增加@Html.PagedListPager:
@Html.PagedListPager(Model, page => Url.Action("SearchIndex", new { page, ItemNo = Request["ItemNo"], ItemName = Request["ItemName"] }))
其中page是当前页面, ItemNo和ItemName是表单的查询条件。如果不加“ItemNo = Request["ItemNo"], ItemName = Request["ItemName"] ”,点击下一页时,查询条件就变为空了。
源码:donetproj/MVC查询和分页 · runliuv/mypub - 码云 - 开源中国 (gitee.com)