MVC中实现加载更多

需要实现的功能:

  1. 数据太多想初次加载部分数据,在底部加上“加载更多”按钮
  2. 点击后加载第二页数据(从数据库只取指定页数据)后接在已有数据后面(类似于android中的下拉加载更多)
  3. 每次加载时显示“正在加载……”

网上找了一些方法,类似于MvcPager分页组件,用的是v1.5.0版,但后台需要将分页后的对象列表ToPagedList,需要在MvcPager源码中加入public static PagedList<T> ToPagedList<T>(this IList<T> list, int pageIndex, int pageSize, int? totalCount)方法,控件详见  MVC中局部视图的使用 一文。

 

主页面Index的View中添加局部视图:

    <div id="goodslist" class="goodslist">
       @{Html.RenderPartial("_ProductListIndex", Model);}
    </div>

 

其中的Model是在Index返回Model

public ActionResult Index(int pageIndex = 1, int pageSize = 4, string viewName = "_ProductListIndex")
        {
            int recordCount = 0;//总记录数

            ProductDomain _productDomain = new ProductDomain();
            List<Product_Entity> _productlist = _productDomain.GetProduct( pageIndex, out recordCount, 0, pageSize);
            PagedList<Product_Entity> _productPageList = _productlist.ToPagedList(pageIndex, pageSize, recordCount);
            if (base.Request.IsAjaxRequest())
            {
                return this.PartialView(viewName, _productPageList);
            }
            return View(_productPageList);
        }     

其中Request.IsAjaxRequest()中判断是否通过分页页码进来的,ToPagedList需要用到改造后的MvcPager组件(见上文)

 

局部视图_ProductListIndex

@using Webdiyer.WebControls.Mvc
@model PagedList<Domain.Shop.Product_Entity>
<div id="ProductListDiv">
    @if (Model != null && Model.Count > 0)
    {

        foreach (var item in Model)
        {
        <div class="goodslist_row">
                <div class="goodslist_col01 item">
                    <div class="item_title">@item.product.title</div>
                    <div class="item_price" style="font-size: 12px;">@String.Format("{0:0.00}{1}", item.product.Price,"元")
                    </div>
                </div>
        </div>
        }
        <div>
            <div style="clear: both;">
            </div>
            <div id="nonedata" class="nonedata" style="display: none;">
                正在获取数据,请稍候...
            </div>
            <div style="clear: both;">
            </div>
            <div class="foot">
                @Html.AjaxPager(Model, new PagerOptions
                   {
                       Id = "divPage",
                       ShowNumericPagerItems = false,
                       ShowPrev = false,
                       ShowFirstLast = false,
                       NextPageText = "查看更多商品>>",
                       ShowDisabledPagerItems = false,
                       AlwaysShowFirstLastPageNumber = false,
                       PageIndexParameterName = "pageIndex",
                       NumericPagerItemCount = 3,
                       CssClass = "moregoods",
                       SeparatorHtml = ""
                   }, new AjaxOptions { UpdateTargetId = "ProductListDiv", LoadingElementId = "nonedata", LoadingElementDuration = 1000, InsertionMode = InsertionMode.InsertAfter })
            </div>
        </div>
    }
</div>

注意几点:

@Html.AjaxPager需要放在局部视图中,否则页码无法更新,由于是要加载到原数据后面因此设置 InsertionMode = InsertionMode.InsertAfter

其中注意的是ShowPrev = false 否则翻页后会显示“上一页” ,@Html.AjaxPager其它属性可 下载MvcPager源码PagerTest.rar 查看

但最重要的是还需要更改jquery.unobtrusive-ajax.js源码,否则会出现多个 “查看更多”

 

  需要更改后的jquery.unobtrusive-ajax.js下载

  

   点击查看更多时效果

现在问题来了,似乎达到效果了,但最重要的问题是初次加载 不显示“正在获取数据,请稍候...”,因为首次是直接由Model生成,没有从页码进去,无法执行beforeSend函数。

观察jquery.unobtrusive-ajax源码,其原理是异步从后台取数据然后经过模板解析后拼接到指定元素后面。

下面弃用MvcPager组件,自己改装,利用Get异步获得数据:

js:

          var _pageIndex = 1;
            $("#goods").click(function () {
             LoadData(_pageIndex);
            });

            //按传参加载数据列表
            function LoadData(pageIndex){
                $("#nonedata").show(1000);
                 //默认加载
                var href = "ProductListIndex";
                if(pageIndex !=null && pageIndex !=""){
                  href+="&pageIndex="+pageIndex;
                }
                $.ajax({
                        url:href,
                        type:"GET",
                        success: function (data, status, xhr) {
                          if(data.indexOf('nonedata') !=-1){
                              $("#goods").hide(1000);
                              if(_pageIndex==1){
                                $("#goodslist").append(data);
                              }
                           }else{
                               $("#goodslist").append(data);
                               _pageIndex ++;
                           }
                        },
                        complete: function () {
                           $("#nonedata").hide(1000);
                        }
                });

            }        

            //加载默认数据
            LoadData(1);

 

$.ajax获得数据后拼接,前后显示隐藏加载提示,并初次加载由前台执行,这样就可实现自己控制 加载提示了。

Control中要进行页码判断,结合前台数据,否则会出现页码不断递增的情况。

 public ActionResult ProductListIndex(int pageIndex = 1, int pageSize = 4, string viewName = "_ProductListIndex")
        {
            int recordCount = 0;//总记录数
            ProductDomain _productDomain = new ProductDomain();
            List<Product_Entity> _productlist = _productDomain.GetProduct( pageIndex, out recordCount, 0, pageSize);
            int totalPageCount = (int)Math.Ceiling(recordCount / (double)pageSize);
            if (pageIndex >totalPageCount )
            {
                //超过数据总数则返回空
                _productlist = new List<Product_Entity>();
            }
            return this.PartialView(viewName, _productlist);
        }

 

在Index页只需要指定加载的框架:

    <div id="goodslist" class="goodslist">

    </div>
    <div style="clear: both;">
    </div>
    <div id="nonedata" class="nonedata">
    正在获取数据,请稍后……
    </div>
    <div style="clear: both;">
    </div>
    <div class="foot">
        <a href="javascript:void(0)" class="moregoods" id="goods">查看更多商品>></a>
    </div>

 

最后初次加载实现效果

总的来说是利用异步获得数据利用局部视图装载数据(不用自己拼字符串)然后加载到指定框架中。

 

时间: 2024-10-29 08:24:15

MVC中实现加载更多的相关文章

iOS开发UI篇—在UItableview中实现加载更多功能

一.实现效果 点击加载更多按钮,出现一个加载图示,三秒钟后添加两条新的数据. 二.实现代码和说明 当在页面(视图部分)点击加载更多按钮的时候,主页面(主控制器)会加载两条数据进来. 视图部分的按钮被点击的时候,要让主控制器加载数据,刷新表格,2B青年会在视图中增加一个主控制器的属性,通过这个属性去调用进行加载,但在开发中通常通过代理模式来完成这个操作. 下面分别是两种实现的代码. 1.项目结构和说明 说明:加载更多永远都放在这个tableview的最下端,因此这里设置成了这个tableview的

在MVC应用程序中动态加载PartialView

原文:在MVC应用程序中动态加载PartialView 有时候,我们不太想把PartialView直接Render在Html上,而是使用jQuery来动态加载,或是某一个事件来加载. 为了演示与做好这个练习,我们先在Views目录下的Home下创建_Partial1.cshtml部分视图,视图内容任你自定义,Insus.NET在本例中只让其显示一些文字与一张图片: 接下来,我们需要建立一个ActionResult()方法,在Controllers目录之下,打开HomeController.cs:

Android中使用ScrollView实现滑动到底部显示加载更多

这是效果 主要是onTouchListener监听事件,监视什么时候滑到底部 同时要理解getMeasuredHeight和getHeight的区别 getMeasuredHeight:全部的长度 包括隐藏的 getHeight:在布局中展示出来的长度 布局文件: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_paren

android上拉下拉加载更多数据

最近项目中用到了ListView的下拉刷新的功能,总结了一下前辈们的代码,单独抽取出来写了一个demo作为示例. 效果图 下拉刷新: 加载更多: CustomListView.java [java] view plaincopy package com.example.uitest.view;      import java.util.Date;   import com.example.uitest.R;   import android.content.Context;   import 

下拉加载更多

前言:由于项目需要,经理喊我做一个瀑布流的视图,在网上找了几个目前主流的几个瀑布流解决方案.最后分别研究了各自的解决方案,我选择了StageredGridView.大家可以在github上找到.但是最后我发现用StageredGridView来实现下拉刷新.上拉加载更多很不方便,并且StageredGridView在很多功能上还不完善.思前想后,几经周折我还是在StageredGridView上找到了突破口. 目标:由于下拉刷新.上拉加载更多,网上已经于很多的相关解决方案,我研究了这些解决方案,

下拉刷新及滚动到底部加载更多的Listview使用

本文主要介绍可同时实现下拉刷新及滑动到底部加载更多的ListView的使用. 该ListView优点包括:a. 可自定义下拉响应事件(如下拉刷新) b.可自定义滚动到底部响应的事件(如滑动到底部加载更多) c.可自定义丰富的样式 d.高效(若下拉样式关闭不会加载其布局,同listView效率一致) e. 丰富的设置. 更多下拉刷新开源项目可见 Android 下拉刷新.底部加载更多开源项目可见 Android 底部加载更多. 示例APK可从这些地址下载:Google Play, 360手机助手,

基于JQuery实现滚动到页面底端时自动加载更多信息

 这篇文章主要介绍了基于JQuery实现滚动到页面底端时自动加载更多信息,类似微博,新浪新闻的评论等,都采用了这方法,需要的朋友可以参考下 关键代码:  代码如下: var stop=true;  $(window).scroll(function(){      totalheight = parseFloat($(window).height()) + parseFloat($(window).scrollTop());      if($(document).height() <= tot

Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多

很想给大家分享这个开源项目,但是由于工作的关系,没有抽出空,但还是趁着工作间隙写下了这篇博客. 简介 LRecyclerView是支持addHeaderView. addFooterView.下拉刷新.分页加载数据的RecyclerView. 它对 RecyclerView 控件进行了拓展,给RecyclerView增加HeaderView.FooterView,并且不需要对你的Adapter做任何修改. 主要功能 下拉刷新.滑动到底部自动加载下页数据: 可以方便添加Header和Footer:

安卓 scrollview嵌套listview上拉加载更多怎么实现啊

问题描述 安卓 scrollview嵌套listview上拉加载更多怎么实现啊 5C 如题 这个怎么实现啊,嵌套了监听不到 lv.setOnScrollListener(this) 这个事件 解决方案 Android scrollview中嵌套listview实现listview的下拉刷新上拉加载更多Android开发--上拉加载更多ListView实现ListView实现上拉加载更多 解决方案二: scrollview 直接嵌套listview 是不会实现上拉加载.两者一起使用起了冲突.这个时