欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# Web分页功能实现

程序员文章站 2022-10-27 23:30:55
无论是网站还是APP分页功能都是必不可少的。为什么使用分页呢? 1,加载速度快,不会占用服务器太多资源,减少服务器压力。 2,减少数据库压力。 3,提升用户体验。 那么我们常用的分页方法有两种。 1,真分页:每页都会从数据库读取少量数据,优点就是读取数据量少,性能非常好,大型网站往往采用这种方式。 ......

无论是网站还是app分页功能都是必不可少的。为什么使用分页呢?

1,加载速度快,不会占用服务器太多资源,减少服务器压力。

2,减少数据库压力。

3,提升用户体验。

 

那么我们常用的分页方法有两种。

1,真分页:每页都会从数据库读取少量数据,优点就是读取数据量少,性能非常好,大型网站往往采用这种方式。

2,假分页:从数据库一次性读取大量数据,但由于数据量比较大,导致响应时间长,但是之后的每一页都是快速显示,避免多次访问数据库。

我们常用的就是数据库分页(真分页)。下面看是如何实现的。

 

先定义存储过程

 

create proc datauser
@page int,
@intpagenum int,
@total int output
as
declare
@startindex int,
@endindex int;
set @startindex=(@page-1)*@intpagenum+1;
set @endindex=@page*@intpagenum;
begin
 select @total=count(1) from blogs_user
 select openid,username,href_img,convert(varchar(20),addtime,20) as addtime from (select *,row_number() over(order by addtime desc) as tableid from blogs_user) tableuser where tableid>=@startindex and tableid<=@endindex
end

 

现在我们封装执行存储过程的方法

/// <summary>
/// 执行存储过程,返回datatable和总记录条数
/// </summary>
/// <param name="page">页码</param>
/// <param name="intpagenum">每页数量</param>
/// <returns></returns>
public static jsondatatable getuserdatadao(int page, int intpagenum)
{
            try
            {
                dataset ds = new dataset();
                jsondatatable result = new jsondatatable();
                using (sqlconnection conn = new sqlconnection(getconnection()))
                {
                    using (sqlcommand cmd = conn.createcommand())
                    {
                        cmd.commandtext = "datauser";//存储过程名称
                        cmd.commandtype = commandtype.storedprocedure;
                        cmd.parameters.add(new sqlparameter("@page", sqldbtype.int));//入参
                        cmd.parameters.add(new sqlparameter("@intpagenum", sqldbtype.int));//入参
                        cmd.parameters["@page"].value = page;
                        cmd.parameters["@intpagenum"].value = intpagenum;
                        sqlparameter parameter = cmd.parameters.add("@total", sqldbtype.int);
                        parameter.direction = parameterdirection.output;
                        if (conn.state == connectionstate.closed)
                        {
                            conn.open();
                        }
                        sqldataadapter my = new sqldataadapter(cmd);
                        my.fill(ds);
                        result.dt = ds.tables[0];
                        result.total = convert.toint32(cmd.parameters["@total"].value);
                        conn.close();
                        return result;
                    }
                }
            }
            catch (exception e)
            {
                errorlog.write("后台获取用户列表异常", e);
                return null;
            }
}

 

封装读取数据接口

[httppost]
public jsonresult getuserlist(int page, int intpagenum)
{
            jsondatatable result = blogs_userdao.getuserdatadao(page, intpagenum);
            if (result != null && result.dt != null && result.dt.rows.count > 0)
            {
                result.jsondata = jsonhelper.jsondatatable(result.dt);
                result.dt = null;
                return basejsonresult.getinstance().createjsongetresult(true, "成功!", result);
            }
            return basejsonresult.getinstance().createjsongetresult(false, "失败,没有数据!", null);
}

后台分页就已经完成了。

 

前端js调用,有分页的ui组件,也可以自己做成“加载更多”分页方式,使用ajax调用接口异步加载数据。

//加载更多点击事件 dataloading() {
            this.page++;//当前页码
            $.post("/m_blogsapi/getnewshare", { page: this.page, sharetypeid: 0, pagesize: this.pagesize }, function (data) {
                if (data.result) {
                    var addnewshare = json.parse(data.data.newsharejson);
                    for (var i = 0; i < addnewshare.length; i++) {
                        app.blogs_newshare.push(addnewshare[i]);
                    }
                }
            });
}

这里我使用的vue。先默认page=1,点击加载更多时,page+1,再调用接口读取当前页面的数据再循环添加到数组里面。效果看博客留言或者短视频页面。

 

本文来自:c# web分页功能实现 | 小曾博客