首页 > 其他分享 >.NET 个人博客-首页排版优化-2

.NET 个人博客-首页排版优化-2

时间:2023-08-05 19:44:06浏览次数:41  
标签:PageSize await param PaginationMetadata 首页 文章 post 排版 NET

个人博客-首页排版优化-2

原本这篇文章早就要出了的,结果之前买的服务器服务商跑路了,导致博客的数据缺失了部分。我是买了一年的服务器,然后用了3个月,国内跑路云太多了,然后也是花钱重新去别的服务商买了一台服务器,这次只买了一个月,先试试水。

优化计划

本篇文章优化历史文章

实现思路

页面数据代码

public async Task<IActionResult> Index()
{
    HomeViewModel homeView = new HomeViewModel()
    {
        FeaturedPhotos = _fPhotoService.GetFeaturePhotos(),
        FeaturedCategories = _fCategoryService.GetFeaturedCategories(),
        TopPost =await _TopPostService.GetTopOnePostAsync(),
        FeaturedPosts = await _PostService.GetFeaturedPostsAsync(new QueryParameters
        {
            Page = 1,
            PageSize = 8,
        }),
        Links = await _linkService.GetAll(),
        Notices = await _noticeService.GetAllAsync(),
        HomePost = await _articelsService.HomePostAsync(),
    };
    return View(homeView);
}

把FeaturedPosts中的PageSize参数8改为4,让推荐文章只展示4个,然后新增历史文章,也就是全部文章。

代码实现

接口与实现类

看过之前文章的应该知道之前分页用的是插件,但是那个插件分页需要把数据库的内容全部查询出来,然后再分页,非常影响性能。考虑到博客长期的发展,也是用Skip和Take关键字去进行分页,使用这两个关键字的好处是不会把数据从数据库全部拿去来,而是在查询的时候就对数据进行分页查询,我需要多少数据就拿多少数据,这样做大大减少了服务端的压力。

  1. Skip属性:Skip属性用于跳过指定数量的元素,返回剩余的元素。它接受一个整数参数,表示要跳过的元素数量。例如,如果有一个包含10个元素的集合,使用Skip(5)将跳过前5个元素,返回后面的5个元素。
  2. Take属性:Take属性用于获取指定数量的元素。它接受一个整数参数,表示要获取的元素数量。例如,如果有一个包含10个元素的集合,使用Take(5)将返回前5个元素。

下面代码返回值是一个元组包含(List, PaginationMetadata),PaginationMetadata是一个分页信息类,在现在这个场景其实是不需要这个类的,可以做下处理,也可以不做处理,没有影响。

Task<(List<Post>, PaginationMetadata)> GetAllPostsAsync(QueryParameters param);

public async Task<(List<Post>, PaginationMetadata)>GetAllPostsAsync(QueryParameters param)
  {
      var querySet =  _myDbContext.posts.AsQueryable();
      var posts = await _myDbContext.posts
      .OrderByDescending(o => o.CreationTime)
      .Include(p => p.Categories)
      .Include(p => p.Comments)
      .Skip((param.Page - 1) * param.PageSize)
      .Take(param.PageSize)
      .ToListAsync();
      var pagination = new PaginationMetadata()
      {
          PageNumber = param.Page,
          PageSize = param.PageSize,
          TotalItemCount = await querySet.CountAsync()
      };
      return (posts, pagination);
  }

控制器

给HomeViewModel类添加AllPosts属性

public (List<Post>, PaginationMetadata) AllPosts { get; set; }

然后在控制器方法中调用查询数据的实现方法

        public async Task<IActionResult> Index()
        {
            HomeViewModel homeView = new HomeViewModel()
            {
            	......
                AllPosts = await _PostService.GetAllPostsAsync(new QueryParameters
                {
                    Page = 1,
                    PageSize = 8,
                })
            };
            return View(homeView);
        }

接下来就是Razor页面的代码了

直接把之前推荐文章页面的代码copy过来就好了,只需要修改model的类型为(List<Personalblog.Model.Entitys.Post>,PaginationMetadata),可以看到实际上只需要Post列表就能完成想要的效果。

AllPostCard.cshtml

@model (List<Post>,PaginationMetadata)

@foreach (var post in @Model.Item1)
{
    <div class="col-md-6 box">
        <div class="row g-0 border rounded overflow-hidden flex-md-row mb-4 shadow-sm h-md-250 position-relative">
            <div class="col p-4 d-flex flex-column position-static">
                <strong class="d-inline-block mb-2 text-primary">@post.Categories.Name</strong>
                <h5 class="mb-0">@post.Title</h5>
                <div class="mb-1 text-muted d-flex align-items-center">
                    <span class="me-2">@post.LastUpdateTime.ToShortDateString()</span>
                    <div class="d-flex align-items-center">
                        <i class="bi bi-eye bi-sm me-1"></i>
                        <span style="font-size: 0.875rem;">@post.ViewCount</span>
                    </div>
                    <span style="width: 10px;"></span> <!-- 这里设置了一个 10px 的间距 -->
                    <div class="d-flex align-items-center">
                        <i class="bi bi-chat-square-dots bi-sm me-1"></i>
                        <span style="font-size: 0.875rem;">@post.Comments.Count</span>
                    </div>
                </div>
                <p class="card-text mb-auto">@post.Summary.Limit(50)</p>
                <a class="stretched-link"
                   asp-controller="Blog" asp-action="Post" asp-route-id="@post.Id">
                    Continue reading
                </a>
            </div>
            <div class="col-auto d-none d-lg-block">
                <img class="bd-placeholder-img" alt="" style="width:200px;height: 250px"
                     src="@Url.Action("GetRandomImage", "PicLib" ,new { seed = post.Id,Width = 800, Height = 1000})">
            </div>
        </div>
    </div>
}

js代码

然后也是和之前一样,写一个返回布局页的代码,用ajax请求就行了

.NET6 个人博客-推荐文章加载优化 - 妙妙屋(zy) - 博客园 (cnblogs.com) https://www.cnblogs.com/ZYPLJ/p/17495172.html

效果展示

image
image

标签:PageSize,await,param,PaginationMetadata,首页,文章,post,排版,NET
From: https://www.cnblogs.com/ZYPLJ/p/17608493.html

相关文章

  • Kubernetes中的ingress问题
    大佬们想问一下我这个问题该如何解决啊,ip访问没问题,但是域名就有问题了     ......
  • .Net Core ActionFilter
    目录作用实现IActionFilterIAsyncActionFilterActionFilterAttributeDemoCustomAsyncActionFilter.csTestFilterController.cs如何在Actionfilter使用日志Action.csCustomAsyncActionFilter.cs全局注册Program.cs作用在请求AuthorizeFilter->ResourceFilter->ActionFilt......
  • 老派Sql之必要,逆天,我在ef core中使用ado.net!
    Wlkr.Core.EFCore逆天,我在efcore中使用ado.net!老派Sql之必要当你开发生涯中基本只用一两种数据库当你觉得用EF的类写报表时很别扭当你觉自己的Sql(Server)语句写得出神入化当你觉自己的Sql(Server)语句比EF生成的更优化当你刚从.netframework转.netcore,还不知道sqls......
  • 探索ASP.NET Framework WebAPI的简介与应用
    一、什么是WebAPI?1.1-什么是WebAPI?WebAPI是一种用开发系统接口、设备接口API的技术,基于Http协议,请求和返回格式默认是Json格式。比WCF简单、更通用;比WebService更节省流量,更简洁。1.2-WebAPI的特点?Action方法直接返回对象,专注于数据更符合Restful的风格有利于独立于IIS部署Action可......
  • 探索ASP.NET Framework WebAPI的简介与应用
    一、什么是WebAPI?1.1-什么是WebAPI?WebAPI是一种用开发系统接口、设备接口API的技术,基于Http协议,请求和返回格式默认是Json格式。比WCF简单、更通用;比WebService更节省流量,更简洁。1.2-WebAPI的特点?Action方法直接返回对象,专注于数据更符合Restful的风格有利于独立于IIS部......
  • .NetCore + Selenium IIS 部署踩坑记
    一、问题   使用Selenium+chromedriver开发自动操作页面demo,本地调试使用IISExpress正常,部署到IIS访问接口代码正常执行,但是,但是页面并没有启动二、排查  网上找相似情况大概以下几种 1,chromedriver和chrome的版本不一致 2,IIS用户权限 3,代码写法问题 本......
  • vb.net Linq XML Xdocument Descendants 为空
    在使用xdocumentdesendants进行筛选元素时,发现结果为空 经过网友的文章提醒发现是命名空间的问题在使用linqwhere进行网页元素筛选时发现descendants("div")不起作用,而是用descendatns可以看到元素枚举DimieAsIEnumerable(OfXElement)=ex1.Descendant......
  • C#.NET 国密SM3 HASH 哈希 与JAVA互通 ver:20230803
    C#.NET国密SM3HASH哈希与JAVA互通ver:20230803 .NET环境:.NET6控制台程序(.netcore)。JAVA环境:JAVA8,带maven的JAVA控制台程序。 简要解析:1:明文输入参数都需要string转byte[],要约定好编码,如:UTF8。2:输出参数:byte[],在传输时需要转为string,要约定好编码,如:16进......
  • NNs(Neural Networks,神经网络)和Polynomial Regression(多项式回归)等价性之思考,以及深度
    NNs(NeuralNetworks,神经网络)和PolynomialRegression(多项式回归)等价性之思考,以及深度模型可解释性原理研究与案例1.MainPoint0x1:行文框架第二章:我们会分别介绍NNs神经网络和PR多项式回归各自的定义和应用场景。第三章:讨论NNs和PR在数学公式上的等价性,NNs......
  • CentOS7虚拟机网络无法连接问题 --- network.service failed---已解决,亲测有效
    问题描述昨天虚拟机用的好好的,今天虚拟机网络突然挂掉了,FinalShell无法连接,Radis无法使用了,自己尝试无果后,把问题抛给了同事,同事用三个命令行就解决了,现在对问题进行记录,方便以后查阅。问题排查首先,我打开命令窗口,在命令行输入ifconfig指令,发现IP地址直接不见了。什么情况?然后,我打......