MVC5学习系列——排序、过滤、分页

来源:互联网 发布:java工程师刚入职 编辑:程序博客网 时间:2024/06/07 07:08

MVC5学习笔记,这次练习一下MVC列表的排序、筛选、分页。参考官网地址:Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application。

这次我们从头开始,首先我们创建一个空的MVC应用程序,之后先做一下准备工作,我们在根目录下添加Content文件夹并在创建子文件夹Bootstrap/3.3.6用来存放样式文件,然后Views文件夹中创建Shared/_LayoutMovie.cshtml布局文件,代码如下:

<span style="font-size:18px;"><!DOCTYPE html><html><head>    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>@ViewBag.Title - 我的电影</title>    <link href="~/Content/Bootstrap/3.3.6/bootstrap.min.css" rel="stylesheet" /></head><body>    <div class="container">        @RenderBody()    </div></body></html></span>
随后,添加模型—Movie,代码如下:

<span style="font-size:18px;">using System;using System.ComponentModel.DataAnnotations;namespace DDZ.MVC5Paging.Models{    public class Movie    {        public int ID { get; set; }        [Display(Name = "电影名称")]        [Required]        [MinLength(3)]        [MaxLength(50)]        public string Title { get; set; }        [Display(Name = "发行日期")]        [DataType(DataType.Date)]        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]        public DateTime ReleaseDate { get; set; }        [Display(Name = "电影类型")]        [StringLength(50)]        public string Genre { get; set; }        [Display(Name = "电影售价")]        [Range(0, 100)]        public decimal Price { get; set; }    }}</span>
然后,我们选中“包含视图的MVC控制器(使用Entity Framework)”,按照下图创建控制器:


在调试之前呢,首先修改一下默认路由和web.config,如下图:

<span style="font-size:18px;">public class RouteConfig    {        public static void RegisterRoutes(RouteCollection routes)        {            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");            routes.MapRoute(                name: "Default",                url: "{controller}/{action}/{id}",                defaults: new { controller = "Movies", action = "Index", id = UrlParameter.Optional }            );        }    }</span>

<span style="font-size:18px;">  <connectionStrings>  <!--<add name="DDZMVC5PagingContext" connectionString="Data Source=(localdb)\MSSQLLocalDB; Initial Catalog=DDZMVC5PagingContext-20160214174718; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|DDZMVC5PagingContext-20160214174718.mdf"      providerName="System.Data.SqlClient" />-->   <add name="DDZMVC5PagingContext" connectionString="Data Source=.;Initial Catalog=DDZMVC5PagingContext;uid=sa; pwd=sa;" providerName="System.Data.SqlClient" />  </connectionStrings></span>

在配置完这些之后,我们开始调试。因为是第一次调试,程序会自动创建数据库,然后我们先插入一些数据,如下图:

重点正式开始:首先是排序,看一下视图页面代码

<span style="font-size:18px;"> <tr>        <th>            @Html.ActionLink("电影名称", "Index", new { sortOrder = ViewBag.TitleSortParm})        </th>        <th>            @Html.ActionLink("发布日期", "Index", new { sortOrder = ViewBag.ReleaseDateSortParm})        </th>        <th>            @Html.ActionLink("体裁", "Index", new { sortOrder = ViewBag.GenreSortParm})        </th>        <th>            @Html.ActionLink("票价", "Index", new { sortOrder = ViewBag.PriceSortParm })        </th>        <th></th>    </tr></span>
接着是Movies控制器Index方法:

<span style="font-size:18px;">public ActionResult Index(string sortOrder)        {            ViewBag.TitleSortParm = String.IsNullOrEmpty(sortOrder) ? "title_desc" : "";            ViewBag.ReleaseDateSortParm = sortOrder == "date" ? "date_desc" : "date";            ViewBag.GenreSortParm = sortOrder == "genre" ? "genre_desc" : "genre";            ViewBag.PriceSortParm = sortOrder == "price" ? "price_desc" : "price";            var movies = from s in db.Movies                         select s;            switch (sortOrder)            {                case "title_desc":                    movies = movies.OrderByDescending(s => s.Title);                    break;                case "date":                    movies = movies.OrderBy(s => s.ReleaseDate);                    break;                case "date_desc":                    movies = movies.OrderByDescending(s => s.ReleaseDate);                    break;                case "genre":                    movies = movies.OrderBy(s => s.Genre);                    break;                case "genre_desc":                    movies = movies.OrderByDescending(s => s.Genre);                    break;                case "price":                    movies = movies.OrderBy(s => s.Price);                    break;                case "price_desc":                    movies = movies.OrderByDescending(s => s.Price);                    break;                default:                    movies = movies.OrderBy(s => s.Title);                    break;            }            return View(movies.ToList());        }</span>
结果如下图:



其次是过滤搜索,先看一下修改的视图代码:

<p>    @Html.ActionLink("添加电影", "Create")</p><span style="background-color: rgb(255, 255, 102);">@using (Html.BeginForm("Index", "Movies", FormMethod.Get, new { @class = "form-inline" })){    <p>        电影名称: @Html.TextBox("searchMovieTitle", null, new { @class = "form-control", @placeholder = "请输入电影名称" })        体裁: @Html.DropDownList("searchMovieGenre", ViewData["searchMovieGenreList"] as SelectList, "请选择体裁", new { @class = "form-control" })        <input type="submit" value="查询" class="btn btn-default" />    </p>}</span><table class="table">       <tr>        <th>            @Html.ActionLink("电影名称", "Index", new { sortOrder = ViewBag.TitleSortParm<span style="background-color: rgb(255, 255, 51);">, searchMovieTitle = ViewData["searchMovieTitle"], searchMovieGenre = ViewData["searchMovieGenre"] </span>})        </th>        <th>            @Html.ActionLink("发布日期", "Index", new { sortOrder = ViewBag.ReleaseDateSortParm<span style="background-color: rgb(255, 255, 51);">, searchMovieTitle = ViewData["searchMovieTitle"], searchMovieGenre = ViewData["searchMovieGenre"] </span>})        </th>        <th>            @Html.ActionLink("体裁", "Index", new { sortOrder = ViewBag.GenreSortParm<span style="background-color: rgb(255, 255, 51);">, searchMovieTitle = ViewData["searchMovieTitle"], searchMovieGenre = ViewData["searchMovieGenre"] </span>})        </th>        <th>            @Html.ActionLink("票价", "Index", new { sortOrder = ViewBag.PriceSortParm<span style="background-color: rgb(255, 255, 51);">, searchMovieTitle = ViewData["searchMovieTitle"], searchMovieGenre = ViewData["searchMovieGenre"] </span>})        </th>        <th></th>    </tr>
再看一下,后台代码:

public ActionResult Index(string sortOrder, string searchMovieTitle, string searchMovieGenre)        {            <span style="background-color: rgb(255, 255, 51);">//搜索            ViewData["searchMovieTitle"] = searchMovieTitle;            ViewData["searchMovieGenre"] = searchMovieGenre;</span>            var movies = from s in db.Movies                         select s;           <span style="background-color: rgb(255, 255, 51);"> //绑定下拉框            var GenreQry = from d in movies                           select d.Genre;            ViewData["searchMovieGenreList"] = new SelectList(GenreQry.Distinct());            //搜索            if (!String.IsNullOrEmpty(searchMovieTitle))            {                movies = movies.Where(s => s.Title.Contains(searchMovieTitle));            }            if (!string.IsNullOrEmpty(searchMovieGenre))            {                movies = movies.Where(x => x.Genre == searchMovieGenre);            }</span>            //排序            ViewBag.TitleSortParm = String.IsNullOrEmpty(sortOrder) ? "title_desc" : "";            ViewBag.ReleaseDateSortParm = sortOrder == "date" ? "date_desc" : "date";            ViewBag.GenreSortParm = sortOrder == "genre" ? "genre_desc" : "genre";            ViewBag.PriceSortParm = sortOrder == "price" ? "price_desc" : "price";            switch (sortOrder)            {                case "title_desc":                    movies = movies.OrderByDescending(s => s.Title);                    break;                case "date":                    movies = movies.OrderBy(s => s.ReleaseDate);                    break;                case "date_desc":                    movies = movies.OrderByDescending(s => s.ReleaseDate);                    break;                case "genre":                    movies = movies.OrderBy(s => s.Genre);                    break;                case "genre_desc":                    movies = movies.OrderByDescending(s => s.Genre);                    break;                case "price":                    movies = movies.OrderBy(s => s.Price);                    break;                case "price_desc":                    movies = movies.OrderByDescending(s => s.Price);                    break;                default:                    movies = movies.OrderBy(s => s.Title);                    break;            }            return View(movies.ToList());        }


最后是分页,首先在“程序包管理控制台” 安装 PagedList.Mvc——Install-Package PagedList.Mvc


安装成功之后,先看一下视图页面修改的代码:
@*@model IEnumerable<DDZ.MVC5Paging.Models.Movie>*@@model PagedList.IPagedList<DDZ.MVC5Paging.Models.Movie>@using PagedList.Mvc;
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount@Html.PagedListPager(Model, pageNum => Url.Action("Index", new { pageNum, searchMovieTitle = ViewData["searchMovieTitle"], searchMovieGenre = ViewData["searchMovieGenre"], sortOrder = ViewBag.CurrentSort }))
然后再看一下,后台代码:
 public ActionResult Index(string sortOrder, string searchMovieTitle, string searchMovieGenre<span style="background-color: rgb(255, 255, 51);">, int? pageNum</span>)        {           <span style="background-color: rgb(255, 255, 51);"> //分页            ViewBag.CurrentSort = sortOrder;</span>            //搜索            ViewData["searchMovieTitle"] = searchMovieTitle;            ViewData["searchMovieGenre"] = searchMovieGenre;            var movies = from s in db.Movies                         select s;            //绑定下拉框            var GenreQry = from d in movies                           select d.Genre;            ViewData["searchMovieGenreList"] = new SelectList(GenreQry.Distinct());            //搜索            if (!String.IsNullOrEmpty(searchMovieTitle))            {                movies = movies.Where(s => s.Title.Contains(searchMovieTitle));            }            if (!string.IsNullOrEmpty(searchMovieGenre))            {                movies = movies.Where(x => x.Genre == searchMovieGenre);            }            //排序            ViewBag.TitleSortParm = String.IsNullOrEmpty(sortOrder) ? "title_desc" : "";            ViewBag.ReleaseDateSortParm = sortOrder == "date" ? "date_desc" : "date";            ViewBag.GenreSortParm = sortOrder == "genre" ? "genre_desc" : "genre";            ViewBag.PriceSortParm = sortOrder == "price" ? "price_desc" : "price";            switch (sortOrder)            {                case "title_desc":                    movies = movies.OrderByDescending(s => s.Title);                    break;                case "date":                    movies = movies.OrderBy(s => s.ReleaseDate);                    break;                case "date_desc":                    movies = movies.OrderByDescending(s => s.ReleaseDate);                    break;                case "genre":                    movies = movies.OrderBy(s => s.Genre);                    break;                case "genre_desc":                    movies = movies.OrderByDescending(s => s.Genre);                    break;                case "price":                    movies = movies.OrderBy(s => s.Price);                    break;                case "price_desc":                    movies = movies.OrderByDescending(s => s.Price);                    break;                default:                    movies = movies.OrderBy(s => s.Title);                    break;            }            return View(<span style="background-color: rgb(255, 255, 51);">movies.ToPagedList(pageNum ?? 1, 3)</span>);            //return View(movies.ToList());        }
最后我们看一下截图:


哈哈,今天就写到这里吧!谢谢!
代码下载:http://download.csdn.net/download/duyelang/9432384

1 0
原创粉丝点击