ASP.NET MVC-制作可排序的表格组件-PagedList版

环境:
win10

参考:
学习ASP.NET MVC(十一)——分页 - DotNet菜园 - 博客园
https://www.cnblogs.com/chillsrc/p/6554697.html
ASP.NET MVC+EF框架实现分页_ef 异步分页-CSDN博客
https://blog.csdn.net/qq_40052237/article/details/106599528


本文略去CRUD代码,默认读者可以连接数据库实现增删改查。之前写过:

ASP.NETMVC-简单例子-数据库查询+razor使用+项目发布_mvc怎么数据库搜索-CSDN博客
https://blog.csdn.net/pxy7896/article/details/139837179

效果

在这里插入图片描述
在这里插入图片描述

准备工作

  1. 使用NuGet安装PagedList.Mvc,安装完成后PagedList也会被安装好。
    在这里插入图片描述
  2. 可选:使用BeginForm时需要异步提交,所以使用jquery.unobtrusive-ajax.min.js。
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-ajax-unobtrusive/3.2.6/jquery.unobtrusive-ajax.min.js"></script>

可以下载放到Scripts文件夹下,使用BundleConfig引入。

思路

跟上一篇文章类似,区别是ViewModel里使用IPagedList<>,连带着前端和后端都有变化。下面直接放代码了。

上一篇:
ASP.NET MVC-制作获取数据并分页的组件-原生代码版-CSDN博客
https://blog.csdn.net/pxy7896/article/details/140372682

实现

ViewModel

    public class ViewMyObject
    {
        public IPagedList<MyObject> MyObject { get; set; }
        public string Search { get; set; } // 关键词
        public string Stype { get; set; } // sur-type
        public string SortBy { get; set; } // asc or desc
        public string PageSize { get; set; } // 每页多少个对象
        public int TotalRows { get; set; } // 总共有多少条数据
    }

前端

需要注意的有两点:

  1. Ajax.BeginForm可以发送异步请求,直接更新UpdateTargetId的内容,这个直接更新整个cshtml就可以了;
  2. BeginForm下,@Html.XX中形成的元素id与name一致,并且是可以跟指定的Action中的形参一致的:
    在这里插入图片描述
  3. @Html.PagedListPager可以非常灵活地使用,通过设置AjaxOptions可以异步地更新数据。

给这个片段起名SearchIndex,内容如下:

@model xxx.ViewMyObject
@using PagedList.Mvc

@{
    ViewBag.Title = "查询";
}

<div id="resultDiv">
    @using (Ajax.BeginForm("SearchIndex", "Home", new AjaxOptions { HttpMethod = "GET", UpdateTargetId = "resultDiv" }))
    {
        <p>
            种类: @Html.DropDownList("Category", "All")
            名称: @Html.TextBox("searchString")
            排序: @Html.DropDownList("sortBy", "不排序")
            每页显示
            @Html.DropDownList("pageSize", "10")
            条数据
            <input type="submit" value="查询" />
        </p>
    }



    @if (Model != null)
    {
        <table>
            <!-- 与上一篇完全一致,略 -->
        </table>
		<!-- 翻页 -->
        <div>
            共 @Model.TotalRows 条数据,第@(Model.MyObject.PageCount < Model.MyObject.PageNumber ? 0 : Model.MyObject.PageNumber)页,共 @Model.MyObject.PageCount 页

            @Html.PagedListPager(Model.MyObject,
                page => Url.Action("SearchIndex", new {
                    category = Model.Stype,
                    search = Model.Search,
                    sortBy = Model.SortBy,
                    page,
                    pageSize = Model.PageSize
                }),
                PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing(
                    new PagedListRenderOptions {
                        Display = PagedListDisplayMode.IfNeeded,
                        DisplayLinkToFirstPage = PagedListDisplayMode.Never,
                        DisplayLinkToLastPage = PagedListDisplayMode.Never,
                        DisplayLinkToIndividualPages = true,
                        MaximumPageNumbersToDisplay = 5,
                        DisplayLinkToPreviousPage = PagedListDisplayMode.Always,
                        DisplayLinkToNextPage = PagedListDisplayMode.Always
                    },
                    new AjaxOptions {
                        HttpMethod = "GET",
                        UpdateTargetId = "resultDiv",
                        InsertionMode = InsertionMode.Replace
                    }
                )
            )

        </div>
    }

</div>

主页面

与上一篇一致:

@Html.Partial("SearchIndex", Model.ViewMyObject)

主页面控制器

首先,必须要在主页面带的对象的类定义里增加ViewMyObject类的变量,并且在初始化主页面的对象时,也初始化这个ViewMyObject类的变量。

其次,数据更新的代码如下所示,需要注意的点有:

  1. 通过ViewBag传递的变量,在初始化主页面的对象时也要初始化;
  2. 如果要带搜索功能的话,一定要先完成搜索/筛选,最后写分页。如果提前写了分页,那搜索功能会只局限在当前页面;
  3. 初始化ViewMyObject时,对于IPagedList<>类型的变量,不能直接使用来自类似这样的语句的变量var myObject = from m in db.myObject select m;,而要经过一个OrderBy操作,不然会报错:
The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'.

在这里插入图片描述
只要取消蓝圈部分的注释就不会报错了。

更新表格数据的代码如下:

public ActionResult SearchIndex(string Category, string searchString, string sortBy, int? page, string pageSize)
{
    MyDbContext db = new MyDbContext();
	// 构造类型选择框
    var cateLst = new List<string>();
    var cateQry = from d in db.myObject
                  orderby d.stype
                  select d.stype;
    cateLst.AddRange(cateQry.Distinct());
    ViewBag.Category = new SelectList(cateLst);

    //排序选项
    var orderbyLst = new Dictionary<string, string>
    {
        { "名称升序", "name_asc" },
        { "名称降序", "name_desc" }
    };
    ViewBag.sortBy = new SelectList(orderbyLst, "Value", "Key");
	
	// 每页放多少数据的选项
    ViewBag.pageSize = new SelectList(new List<string>() { "20", "50", "100"});
	// 获取原始数据
    var myObject = from m in db.myObject
                select m;

    // searchString匹配name
    if (!String.IsNullOrEmpty(searchString))
    {
        myObject = myObject.Where(b => b.name.Contains(searchString));
    }

    // sort by name order
    switch (sortBy)
    {
        case "name_asc":
            myObject = myObject.OrderBy(b => b.name);
            break;
        case "name_desc":
            myObject = myObject.OrderByDescending(b => b.name);
            break;
        default:
            myObject = myObject.OrderBy(b => b.id);
            break;
    }
    // sort by type
    if (!string.IsNullOrEmpty(Category)) {
        //string tmpType = Category.Replace("'", "''");
        myObject = myObject.Where(x => x.stype == Category);
    }
    
    //分页
    int pageItems = 10;// 每页放几个
    if (!string.IsNullOrEmpty(pageSize)) {
        pageItems = int.Parse(pageSize);
    }
    
    //  view model
    ViewMyObject vbp = new ViewMyObject();
    int currentPage = (page ?? 1);
    IPagedList<MyObject> pageMyObject = myObject.ToPagedList(currentPage, pageItems);
    vbp.MyObject = pageMyObject;
    vbp.Stype = Category;
    vbp.SortBy = sortBy;
    vbp.Search = searchString;
    vbp.PageSize = pageSize;
    vbp.TotalRows = myObject.Count();

    return PartialView("SearchIndex", vbp);
}

彩蛋

如果要在单独的网页上更新,不需要做成组件,就比较简单了。此时不需要考虑异步,搜索按钮的提交和页面选择都可以直接制作url。

前端

需要修改两处:

  1. 使用Html.BeginForm
  2. 翻页部分直接用Url.Action
@using (Html.BeginForm("SearchIndex", "Home", FormMethod.Get))
{}

@Html.PagedListPager(Model.MyObject, page => Url.Action("SearchIndex", new { 查询参数 }))

后端

修改SearchIndex(),将return PartialView("SearchIndex", 对象);改为return View(对象)即可。

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET MVC EasyUI-Tree 是一种用于在ASP.NET MVC应用程序中实现树状结构的开源插件。它基于EasyUI框架,为开发人员提供了一种简单而强大的方式来展示和操作树形数据。 使用ASP.NET MVC EasyUI-Tree可以实现以下功能: 1. 数据展示:可以将树状数据以层级结构展示出来,帮助用户更直观地理解数据之间的关系。 2. 数据操作:可以对树状数据进行增加、编辑和删除等操作,使用户可以方便地对树节点进行维护和管理。 3. 数据筛选:可以通过设置过滤条件实现对树状数据的快速筛选,只显示符合条件的节点。 4. 数据排序:可以对树状数据进行排序,按照特定字段的升序或降序排列。 5. 数据搜索:可以通过关键字搜索来快速定位包含特定内容的节点。 6. 数据导入/导出:可以将树状数据导入到Excel等格式文件中,或者将外部数据导入到树状结构中。 7. 数据异步加载:对于大量数据,可以采用异步加载的方式实现分页加载,提升性能和用户体验。 使用ASP.NET MVC EasyUI-Tree需要进行一些配置和编写代码,但整体来说相对容易上手。它提供了丰富的API和事件以供开发人员自定义和扩展,能够满足不同需求的应用场景。 总而言之,ASP.NET MVC EasyUI-Tree是一个强大而易用的工具,能够帮助开发人员在ASP.NET MVC应用程序中轻松地实现树状结构的展示和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值