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

这篇博客介绍了如何在MVC5应用中实现列表的排序、过滤和分页功能。作者首先创建了一个空的MVC项目,然后进行必要的准备工作,包括设置布局文件、调整路由和配置。在内容部分,详细展示了视图页面和过滤搜索的代码实现。
摘要由CSDN通过智能技术生成

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值