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

news2024/9/22 5:33:58

环境:
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

目录

  • 效果
  • 准备工作
  • 思路
  • 实现
    • ViewModel
    • 前端
    • 主页面
    • 主页面控制器
  • 彩蛋
    • 前端
    • 后端

效果

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

准备工作

  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(对象)即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式IO系统BL201 Profinet耦合器

BL201耦合器是一个数据采集和控制系统&#xff0c;基于强大的32 位微处理器设计&#xff0c;采用Linux操作系统&#xff0c;是一种模块化的分布式I/O系统。该系统由3部分组成&#xff1a;现场总线耦合器和各种类型的&#xff08;数字和模拟信号以及特殊功能&#xff09;I/O模块…

部署k8s 1.28.9版本

继上篇通过vagrant与virtualBox实现虚拟机的安装。笔者已经将原有的vmware版本的虚拟机卸载掉了。这个场景下&#xff0c;需要重新安装k8s 相关组件。由于之前写的一篇文章本身也没有截图。只有命令。所以趁着现在。写一篇&#xff0c;完整版带截图的步骤。现在行业这么卷。离…

C#与倍福Plc通信——使用仿真软件模拟倍福PLC运行

前言 我们在编写上位机与倍福PLC通信的过程中,有时候我们没有真实的Plc,但是我们又想提前测试与倍福PLC的通信,那么这个时候我们就可以使用倍福的仿真软件模拟PLC,然后我们上位机就可以与仿真PLC进行通信了,下面进行详细介绍: 1、下载并安装倍福PLC编程软件TwinCAT 安…

Uniapp自定义动态加载组件(2024.7更新)

1.本次介绍如何使用uniapp实现自定义动态加载Loading的组件&#xff0c;可以gif格式&#xff0c;也可以mp4格式等; 编写自定义Loading组件(CustomLoader.vue)&#xff1b;组件中含有“动态接收图片路径”&#xff0c;“10秒超时未false则自动断开关闭Loading”&#xff1b;在全…

基于STC8H4K64TL单片机的触摸功能调试

基于STC8H4K64TL单片机的触摸功能调试 STC8H4K64TL单片机介绍STC8H4K64TL单片机管脚图(48个引脚)STC8H4K64TL单片机串口仿真与串口通信STC8H4K64TL单片机管脚图(32个引脚)STC8H4K64TL单片机管脚图(20个引脚)STC8H系列单片机管脚说明STC8H系列单片机I/O口STC8H系列单片机I…

在MoneyPrinterPlus中使用本地chatTTS语音模型

之前MoneyPrinterPlus在批量混剪,一键AI生成视频这些功能上的语音合成功能都用的是云厂商的语音服务&#xff0c;比阿里云&#xff0c;腾讯云和微软云。 云厂商虽然提供了优质的语音服务&#xff0c;但是用起来还是要收费。 为了各位小伙伴的钱包&#xff0c;现在特意给Money…

基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真. 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 &#xff08;完整程序运行后无水印&#xff09;…

【Springboot】新增profile环境配置应用启动失败

RT 最近接手了一个新的项目&#xff0c;为了不污染别人的环境&#xff0c;我新增了一个自己的环境配置。结果&#xff0c;在启动的时候总是失败&#xff0c;就算是反复mvn clean install也是无效。 问题现象 卡住无法进行下一步 解决思路 由于之前都是能启动的&#xff0c…

zookeeper+kafka的消息队列

zookeeperKafka 两个都是消息队列的工具 消息队列 出现原因&#xff1a;生产者产生的消息与消费者处理消息的效率相差很大。为了避免出现数据丢失而设立的中间件。 在消息的生产者与消费之间设置一个系统&#xff0c;负责缓存生产者与消费者之间的消息的缓存。将消息排序。 优…

nginx生成自签名SSL证书配置HTTPS

一、安装nginx nginx必须有"--with-http_ssl_module"模块 查看nginx安装的模块&#xff1a; rootecs-7398:/usr/local/nginx# cd /usr/local/nginx/ rootecs-7398:/usr/local/nginx# ./sbin/nginx -V nginx version: nginx/1.20.2 built by gcc 9.4.0 (Ubuntu 9.4.0…

MySQL之触发器

1&#xff0c;创建表 CREATE TABLE Product (Id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,Name VARCHAR(20) NOT NULL,Function VARCHAR(50),Company VARCHAR(20) NOT NULL,Address VARCHAR(20) ); CREATE TABLE Operate (Op_id INT(10) NOT NULL AUTO_INCREMENT PRIMAR…

Leetcode—146. LRU 缓存【中等】(shared_ptr、unordered_map、list)

2024每日刷题&#xff08;143&#xff09; Leetcode—146. LRU 缓存 先验知识 list & unordered_map 实现代码 struct Node{int key;int value;Node(int key, int value): key(key), value(value) {} };class LRUCache { public:LRUCache(int capacity): m_capacity(capa…

Spring Boot集成qwen:0.5b实现对话功能

1.什么是qwen:0.5b&#xff1f; 模型介绍&#xff1a; Qwen1.5是阿里云推出的一系列大型语言模型。 Qwen是阿里云推出的一系列基于Transformer的大型语言模型&#xff0c;在大量数据&#xff08;包括网页文本、书籍、代码等&#xff09;进行了预训练。 硬件要求&#xff1a;…

SWDIO管脚作为GPIO

下面是使用FRDM-K32L2B3开发板和SDK中的frdmk32l2b_gpio_led_output程序做了一些测试&#xff0c;configure SWDIO pin as GPIO pin的流程。 查看手册&#xff0c;找到SWDIO对应的管脚&#xff0c;可以看到PTA3对应的SWDIO管脚。 2.修改Demo程序&#xff0c;在程序中设置SWDIO…

生物素四聚乙二醇叠氮;Biotin-PEG4-Azide

生物素四聚乙二醇叠氮&#xff0c;也被称为Biotin-PEG4-Azide或Azide-PEG4-Biotin&#xff0c;是一种重要的化学化合物&#xff0c;其CAS号为1309649-57-7。以下是对该化合物的详细介绍&#xff1a; 一、基本信息 中文名&#xff1a;生物素四聚乙二醇叠氮 英文名&#xff1a;Bi…

wps批量删除空白单元格

目录 原始数据1.按ctrlg键2.选择“空值”&#xff0c;点击“定位”3. 右击&#xff0c;删除单元格修改后的数据 原始数据 1.按ctrlg键 2.选择“空值”&#xff0c;点击“定位” 如图所示&#xff0c;空值已被选中 3. 右击&#xff0c;删除单元格 修改后的数据

Rust 使用 panic! 还是不用 panic!

使用 panic! 还是不用 panic! 那么&#xff0c;该如何决定何时应该 panic! 以及何时应该返回 Result 呢&#xff1f;如果代码 panic&#xff0c;就没有恢复的可能。你可以选择对任何错误场景都调用 panic!&#xff0c;不管是否有可能恢复&#xff0c;不过这样就是你代替调用者…

【python】基于随机森林和决策树的鸢尾花分类

目录 引言 决策树&#xff08;Decision Tree&#xff09; 随机森林&#xff08;Random Forest&#xff09; 数据集 结果 代码实现 引言 随机森林&#xff08;Random Forest&#xff09;和决策树&#xff08;Decision Tree&#xff09;是两种在机器学习中广泛使用的分类和…

STM32智能农业监测系统教程

目录 引言环境准备智能农业监测系统基础代码实现&#xff1a;实现智能农业监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;农业监测与管理问题解决方案与优化收尾与总结 1. 引言 智能农业监测系统通…

Java二十三种设计模式-建造者模式(4/23)

建造者模式&#xff1a;构建复杂对象的专家 引言 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于创建一个复杂的对象&#xff0c;同时允许用户只通过指定复杂对象的类型和内容就能构建它们&#xff0c;它将对象的构建和表示分离&am…