MVC+Bootstrap+Drapper使用PagedList.Mvc支援多查詢條件分頁

來源:互聯網
上載者:User

標籤:ada   html   url   cti   creat   click   inpu   number   ext   

前幾天做一個小小小項目,使用了MVC+Bootstrap,以前做分頁都是非同步載入Mvc部分視圖的方式,因為這個是小項目,就隨便一點。一般的列表頁面,少不了有查詢條件,下面分享下Drapper+PagedList.Mvc支援多查詢條件分頁的使用經驗。

在MVC中我們一般習慣使用強型別Model,通過分析Orders的展示頁面,來構建這個Model。

1.查詢參數的Model

    public class OrderQueryParamModel    {        /// <summary>        /// 訂單編號        /// </summary>        public string OrderNo { get; set; }        /// <summary>        /// 客戶名稱        /// </summary>        public string CustomerName { get; set; }    }

2.Orders分頁資料Model

PagedList提供了一個StaticPagedList<T>泛型類來封裝資料。(看看StaticPagedList的原始碼,使用非常方便,把T類型的資料subset,pageNumber,pageSize,totalCount初始化進去就可以了。

 public StaticPagedList(IEnumerable<T> subset, IPagedList metaData) : this(subset, metaData.PageNumber, metaData.PageSize, metaData.TotalItemCount)        {        }

3.Orders展示頁面整體Model

    public class OrderViewModel    {        public OrderQueryParamModel QueryModel { get; set; }        public PagedList.StaticPagedList<OrderModel> OrderList { get; set; }     }

OK,接下來看看在Controller中如何給來OrderViewModel填充資料吧

        public ActionResult List(OrderViewModel orderViewModel, int page = 1)        {            var pagesize = 10;            var count = 0;            var orders = _orderService.GetOrders(page, pagesize, model.QueryModel, ref count);            orderViewModel.OrderList = new StaticPagedList<OrderModel>(orders, page, pagesize, count);            return View(orderViewModel);        }

Controller中代碼很簡單,接收POST過來的兩個參數,orderViewModel:包含查詢參數Model,page:PagedList定義的當前頁。

順便看看GetOrders()這個方法吧,為了省事懶得寫預存程序,直接用了Drapper的QueryMultiple,感覺很強大啊。

        public List<OrderModel> GetOrders(int pageindex, int pagesize, OrderQueryParamModel query, ref int count)        {            var orders = new List<OrderModel>();            var whereStr = string.Empty;            if (query != null)            {                if (!string.IsNullOrEmpty(query.CustomerName))                {                    whereStr += string.Format(" and CustomerName like ‘%{0}%‘ ", query.CustomerName);                }            }            var cmd = string.Format(@"SELECT COUNT(*) FROM [Orders] WHERE 1=1 {0};                        SELECT *  FROM (                        SELECT *, row_number() OVER (ORDER BY orderId DESC ) AS [row] 
FROM [Orders] WHERE 1=1 {0} )t WHERE t.row >@indexMin AND t.row<[email protected]", whereStr); using (IDbConnection conn = BaseDBHelper.GetConn()) { using (var multi = conn.QueryMultiple(cmd,
new { indexMin = (pageindex - 1) * pagesize, indexMax = pageindex * pagesize })) { count = multi.Read<int>().SingleOrDefault(); orders = multi.Read<OrderModel>().ToList(); } } return orders; }

這裡要注意下的是,multi.Read的順序必須和Sql查詢出來的資料集合順序一樣。

好了,資料就這麼愉快的擷取了,最後來看看關鍵的前端資料展示吧。

 

1.首先在View中添加引用

@using PagedList.Mvc;@using PagedList;
@model Models.OrderViewModel 

2.為查詢建立一個表單

<div class="page-header">    @using (Html.BeginForm("List", "Order", FormMethod.Post, new { id = "OrderForm", @class = "form-horizontal" }))    {        @Html.Raw("客戶名稱:") @Html.TextBoxFor(m => m.QueryModel.CustomerName)        @Html.Raw("訂單編號:") @Html.TextBoxFor(m => m.QueryModel.OrderNo)        <button type="submit" class="btn btn-purple btn-sm">查詢</button>        //咿,這個幹嗎用的?後面會解釋        <input type="hidden" name="page" value="1" />    }</div>

3.綁定資料

<table class="table loading table-bordered margin-top-5 margin-bottom-5">    <thead>        <tr>            <th>訂單編號</th>            <th>客戶名稱</th>            <th>手機號碼</th>                        <th>商品數量</th>            <th>訂單金額</th>            <th>下單時間</th>        </tr>    </thead>    <tbody>        @foreach (var item in Model.OrderList)        {            <tr>                <td>@item.orderNo</td>                <td>@item.customerName</td>                <td>@item.customerMobile</td>                <td>@item.productQuantity</td>                <td>@item.orderAmount</td>                <td>@item.orderCreateTime</td>            </tr>        }    </tbody></table>

4.綁定分頁外掛程式資料

@if (Model.OrderList != null&&Model.OrderList.Any()){    <div class="pagedList" style="margin:0 auto;text-align:center">        @Html.PagedListPager(Model.OrderList, page => Url.Action("List", new { page }), PagedListRenderOptions.Classic)    </div>}

 

OK,一切搞定了,運行你會發現,分頁導航產生的連結都是 "/Order/List/2" 這種形式,無法支援我們把其他查詢參數也傳遞到Controller。

我們換一個思路,為什麼不把page這個參數放到form表單去了?  還記得我們form中有一個name=page 的hidden input吧?

    $(function () {        $(".pagination > li > a").click(function () {            event.preventDefault();            var index = $(this).html();            if (index == ‘?‘) {                index = parseInt($(".pagination > li[class=active] > a").html()) + 1;            }            if (index == ‘?‘) {                index = parseInt($(".pagination > li[class=active] > a").html()) - 1;            }            if (index < 1) return;            $("input[name=page]").val(index);            $("#OrderForm").submit();        });    });

 

通過這段JS,直接把原來分頁的a標籤作廢了,擷取他的page值放到了form中,然後直接觸發form的submit(),這樣就滿足了我們一般的查詢業務需求。

 

MVC+Bootstrap+Drapper使用PagedList.Mvc支援多查詢條件分頁

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.