ASP.NET MVC中使用MvcPager非同步分頁+在分頁中覆選框下一頁上一頁也保持選中

来源:https://www.cnblogs.com/Hmd528/archive/2019/07/19/11212827.html
-Advertisement-
Play Games

ASP.NET MVC 分頁使用的是作者楊濤的MvcPager分頁控制項 地址:http://www.webdiyer.com/mvcpager/demos/ajaxpaging/ 這個分頁控制項在裡面有很好的的案例,及註意事項 分頁在我們的項目中是經常需要使用到的,普通分頁體驗是在是太差了,每一次點擊 ...


ASP.NET MVC 分頁使用的是作者楊濤的MvcPager分頁控制項  地址:http://www.webdiyer.com/mvcpager/demos/ajaxpaging/

這個分頁控制項在裡面有很好的的案例,及註意事項

分頁在我們的項目中是經常需要使用到的,普通分頁體驗是在是太差了,每一次點擊下一步,會造成頁面刷新,自己都看不過去了 ,O(∩_∩)O哈哈~

所以這次我們要使用這個控制項在做一個MvcPager的非同步分頁,分頁的時候我們只刷新表格,而不是刷新頁面

下麵我們開始吧

一.分頁

首先我們需要創建一個ASP.NET MVC的項目,具體怎麼創建就不細說了

之後我們需要引入 控制項的dll文件

我是在官網下的案例,直接引用的,

當然你們也可以從NuGet包中引用

找到項目,點擊右鍵會有一個管理NuGet程式包,我們打開它

 

 輸入Webdiyer找到,並安裝

實體類

Article.cs
public class Article
    {
        [Display(Name = "文章編號")]
        public int ID { get; set; }
        [Display(Name = "文章標題")]
        [MaxLength(200)]
        public string Title { get; set; }
        [Display(Name = "文章內容")]
        public string Content { get; set; }
        [Display(Name = "發佈日期")]
        public DateTime PubDate { get; set; }
        [Display(Name = "作者")]
        [MaxLength(20)]
        public string Author { get; set; }
        [Display(Name = "文章來源")]
        [MaxLength(20)]
        public string Source { get; set; }
    }

Cotroller

 

 public ActionResult AjaxPaging(int id = 1)
        {
            using (var db = new DataContext())
            {
                var model = db.Articles.OrderByDescending(a => a.PubDate).ToPagedList(id, 5);
          //判斷是否是AJAX請求,如果為true,就返回分部視圖
if (Request.IsAjaxRequest()) return PartialView("_ArticleTable", model); return View(model); } }

應該可以看到,我們引用了這個分頁控制項的時候,我們返回的不在是List<T>,而是PagedList<T>

後面的ToPagedList(起始頁,每頁顯示條數),起始頁需要我們在本方法中定義int id=1

View:

@model PagedList<MVCPager_Text.Models.Article>
@using Webdiyer.WebControls.Mvc;

//這個ID就是我們在分頁需要來更新的ID
<div id="articles">
    @Html.Partial("_ArticleTable", Model)
</div>
@section scripts
{
    @{Html.RegisterMvcPagerScriptResource();}
   //這句話是必須的,用來註冊MVCPager,如果沒有可能造成Ajax請求無反應 }

在視圖中我們引用的集合同樣也是PagedList<T>

@section scripts
{
    @{Html.RegisterMvcPagerScriptResource();}
   //這句話是必須的,用來註冊MVCPager,如果沒有可能造成Ajax請求無反應 }
註意:我們的視圖是預設使用佈局頁 layout
我們不能使佈局頁為Null @{ layout=null} ,這樣會使我們的非同步分頁無效,我們到控制器的Requset.isAjaxRequset()這一塊會一直是false

創建分部視圖:

 

 

創建完分佈頁,裡面的使我們需要展示的表格

_ArticleTable:
@model PagedList<MVCPager_Text.Models.Article>
@using Webdiyer.WebControls.Mvc;
<table class="table table-bordered table-striped">
    <tr>
        <th class="nowrap">序號</th>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.PubDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Author)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Source)
        </th>
    </tr>
    @{ int i = 0;}
    @foreach (var item in Model)
    {
        <tr>
            <td>@(Model.StartItemIndex + i++)</td>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.PubDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Author)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Source)
            </td>
        </tr>
    }
</table>
<div class="text-center">
    @Ajax.Pager(Model, new PagerOptions { PageIndexParameterName = "id", ContainerTagName = "ul", CssClass = "pagination", CurrentPagerItemTemplate = "<li class=\"active\"><a href=\"#\">{0}</a></li>", DisabledPagerItemTemplate = "<li class=\"disabled\"><a>{0}</a></li>", PagerItemTemplate = "<li>{0}</li>" }).AjaxOptions(a => a.SetUpdateTargetId("articles"))
</div>

其中需要註意的是:

PageIndexParameterName是我們控制器中的參數id,需要保持一致

我們需要使用的是@Ajax.Pager(),而不是@Html.Pager
AjaxOptions(a => a.SetUpdateTargetId("articles")) 在官網的意思是用於構建MvcAjaxOptions對象的方法
我們再來看一下
MvcAjaxOptions對象

UpdateTargetId:獲取或設置要使用伺服器響應來更新的 DOM 元素的 ID。這個參數ID就使我們在視圖中div的Id

上面我們用的是AjaxOptions(a => a.SetUpdateTargetId("articles"))這個寫法,

MvcAjaxOptions對象怎麼使用呢
@Ajax.Pager(Model, new PagerOptions { PageIndexParameterName = "id", ContainerTagName = "ul", CssClass = "pagination", CurrentPagerItemTemplate = "<li class=\"active\"><a href=\"#\">{0}</a></li>", DisabledPagerItemTemplate = "<li class=\"disabled\"><a>{0}</a></li>", PagerItemTemplate = "<li>{0}</li>" },new MvcAjaxOptions {UpdateTargetId= "RecordList" })

通過上面這些我們的非同步分頁就已經做完了


二.覆選框選中

當我們點擊上一頁或者下一頁的時候我們需要保持之前的覆選框狀態,
並不會因為我們點擊上一頁或者下一頁而改變狀態

覆選框選中的前提就是我們需要非同步刷新,只刷新表格,不刷新頁面

在這個分頁控制項上,有我們需要的對象
MvcAjaxOptions對象
來看一下這個對象中我們需要用到的屬性,一共只有兩個屬性我們可以用到:

OnBegin:獲取或設置要在更新頁面之前立即調用的 JavaScript 函數的名稱。
OnSuccess:獲取或設置在成功更新頁面之後要調用的 JavaScript 函數。

Code奉上:
分頁中我們需要在MvcAjaxOptions中添加這兩個屬性,一個是在更新頁面之前調用的js函數(OnBegin),一個是在更新頁面之後調用的JS函數(OnSuccess)
    @Ajax.Pager(Model, new PagerOptions {
    PageIndexParameterName = "id",
    NumericPagerItemCount = 5,
    CssClass = "pagination",
    CurrentPagerItemTemplate = "<li class=\"active\"><a href=\"#\">{0}</a></li>",
    DisabledPagerItemTemplate = "<li class=\"disabled\"><a>{0}</a></li>",
    PagerItemTemplate = "<li>{0}</li>", Id = "bootstrappager"
},new MvcAjaxOptions { OnBegin= "GetCheckbox()",OnSuccess= "OnSuccess" } ).AjaxOptions(a => a.SetUpdateTargetId("RecordList").SetDataFormId("searchForm"))

 

GetCheckbox()函數

//定義一個數組來存儲,選中的ID
var select = new Array;

function GetCheckbox() {
      //.single是覆選框的class $(
".single").each(function () {
        //判斷覆選框的狀態,如果選中為true
if ($(this).prop('checked')) {
          //判斷選中的覆選框的val()值是否存在在該數組中select
var index = $.inArray($(this).val(), select);
          //不存在則會返回-1,不存在向數組中寫入
if (index == -1) { select.push($(this).val()) } } else {
          //如果沒有選中,有可能會取消選中,我們要判斷當前的頁面沒有選中的$(this).val()值是否在數組中select
var index = $.inArray($(this).val(), select);
          //如果存在則會返回存在數值在數組中的下標
if (index >= 0) { //刪除該下標的值 select.splice(index); } } }) }

 

OnSuccess();

function OnSuccess() {
        $(".single").each(function () {
        //當更新成功之後,我們需要判斷當前頁面的覆選框的$(this).val()是否存在於數組中select
            var index = $.inArray($(this).val(), select)
        //存在則返回下標
if (index >= 0) { // console.log("index=" + index + ",select[Index]=" + select[index])
          
          如果$(this).val()的值與數組中下標的值相同,則給它處於選中狀態 if ($(this).val() == select[index]) { $(this).prop('checked', 'checked'); } } }) }

這樣就可以實現覆選的選中,
不過需要註意的是:
當我第一次載入進入頁面的時候,就算你選中幾個覆選框,數組中也是沒有數據的
因為只有你點擊下一頁或者是上一頁的時候才會觸發函數,
所以我們也需要在不點擊的時候進行當前頁的一個覆選框的選中判定

 

當我進入這個頁面,選中覆選框之後,就點擊按鈕的時候也需要進行選中






您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 9.5 守護進程 主進程創建守護進程 其一:守護進程會在主進程代碼執行結束後就立即終止 其二:守護進程內無法再開啟子進程,否則拋出異常:AssertionError: daemonic processes are not allowed to have children 註意:進程之間是互相獨立的, ...
  • JVM中(留神:馬上講到的這兩個存儲區只在JVM內部與物理存儲區無關)存在一個主記憶體(Main Memory),Java中所有的變數存儲在主記憶體中,所有實例和實例的欄位都在此區域,對於所有的線程是共用的(相當於黑板,其他人都可以看到的)。每個線程都有自己的工作記憶體(Working Memory),工 ...
  • 元組是一個不可修改的有序序列 格式:tuple_name = (元素1,元素2,元素3,...) ...
  • 這位大佬寫的不錯,每次不會都會去看看https://www.cnblogs.com/shenlanzhizun/p/6027042.html 另外補充一些Java8騷操作 BigDecimal求和 博客中位置:3.2 歸約:reduce(其實已經有了int類型的求和,我寫個這個類型的吧) 另外提一點 ...
  • 多數耗時操作可以非同步執行,推薦async/await。 但和UI相關的部分僅能在UI線程執行,這時UI線程的耗時操作,導致界面卡死,不夠友好。 我們可以創建一個單獨的UI線程顯示一個正在載入的視窗,可以在視窗顯示一些動畫之類的。 如果是WinForms那麼很容易做到。 WPF沒有提供這樣簡單的方式, ...
  • 根據市場需求,基於.NET CORE平臺開發的RoadFlow工作流平臺需要實現多語言版本。經過方案討論和比對,決定採用.NET自帶的本地化功能來實現多語言。話不多說,直接上實現方式。 首先修改Startup.cs 在public void ConfigureServices(IServiceCol ...
  • 首次使用C#編寫與COM口有關的程式,期間遇到了很多問題,寫下自己的經驗總結,如有錯漏,歡迎批評指正! 1、新建一個串口類( SerialPort類) 2、串口埠號搜索: 3、讀數據、顯示數據: 4、寫數據: 5、常用的埠設置和方法: 串口最基本的功能就是實現通信,簡單來說就是讀和寫,就像大家熟 ...
  • Hi、大家好,今天又是美好的一天。 關於 Settings Sync 擴展: Settings Sync可以同步你當前的VSCode配置環境,當你需要在其它的電腦工作時,您不用重頭再來一遍。新機器登錄一下就搞定了。再也不用折騰環境了。 大致原理:使用GitHub Gist來同步多台電腦上的設置,代 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...