Fork me on GitHub

MvcPager 分页示例 — 首页Url SEO

该示例演示MvcPager的首页SEO搜索引擎优化功能,请点击分页按钮跳转到其它页面时注意两个MvcPager首页Url的区别。

MvcPager 2.0以前版本生成分页导航链接时首页的url中也会加上页索引参数,导致与默认的首页url不一致,影响SEO体验。MvcPager 2.0版中新增了自动与手动两种优化首页url的功能,当当前路由定义中页索引参数默认值为UrlParameter.Optional或未定义页索引参数(页索引参数被附加到url中以querystring的方式传递)时,MvcPager在生成首页链接时会自动去除页索引参数,生成与默认首页一致的url。当首页url使用的路由与其它页面不同或页索引参数默认值不是UrlParameter.Optional时,可以通过设置PagerOptions.FirstPageRouteName属性来实现生成与其它页面不同的首页url。

本示例中两个MvcPager均使用相同的路由,生成的分页Url除第一页外完全一样,但第二个MvcPager设置了PagerOptions.FirstPageRouteName = "MvcPager_Default",因此生成的首页Url中没有页索引参数,与首次打开该页面时的Url相同,而第一个MvcPager生成的首页Url中包含页索引参数,导致与默认首页的Url完全不同。

序号 文章标题 作者 文章来源
26 吴起被列为全国首批、全省唯一的农村改革试验区 杨涛 吴起热线
27 陕西省延安市吴起县 Webdiyer 吴起热线
28 吴起打造“绿色革命”圣地 杨涛 吴起热线
29 四国篮球争霸赛将在吴起举行 Webdiyer 吴起政府网
30 土地广阔、资源丰富、景区众多的延安吴起县 杨涛 吴起热线
未启用首页Url SEO:
首页 上页 1 2 3 4 5 6 7 8 9 10 ... 下页 尾页 
启用首页Url SEO(FirstPageRouteName = "MvcPager_Default"):
首页 上页 1 2 3 4 5 6 7 8 9 10 ... 下页 尾页 

View:

@model PagedList<article>
@Html.Partial("_ArticleTable", Model)
<h6><strong>未启用首页Url SEO:</strong></h6>
@Html.Pager(Model, new PagerOptions { PageIndexParameterName = "id", RouteName = "MvcPager_SEO", PagerItemTemplate = "{0}&nbsp;" })
<h6><strong>启用首页Url SEO(FirstPageRouteName = "MvcPager_Default"):</strong></h6>
@Html.Pager(Model, new PagerOptions { PageIndexParameterName = "id", RouteName = "MvcPager_SEO",FirstPageRouteName = "MvcPager_Default", PagerItemTemplate = "{0}&nbsp;"})

路由定义:

routes.MapRoute("MvcPager_Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { id = @"\d*" });
routes.MapRoute("MvcPager_SEO", "{controller}/{action}/page_{id}", new { controller = "Demo", action = "FirstPageUrl", id = 1 }, new { action = "FirstPageUrl" });

_ArticleTable.cshtml:

@model PagedList<Article>
<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>

Model:

    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; }
    }

Controller:

           
        public ActionResult FirstPageUrl(int id = 1)
        {
            using (var db = new DataContext())
            {
                return View(db.Articles.OrderByDescending(a => a.PubDate).ToPagedList(id, 5));
            }
        }