You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MVC Core中解决分页触发自动切换至首个标签视图的问题

问题描述

在MVC Core中实现了带分页的标签视图,用于展示两类不同记录。当前功能整体正常,但存在一个问题:点击第二个标签的分页按钮时,页面重载后会自动切换回第一个标签,需要手动切换至第二个标签才能查看对应分页内容。希望点击对应标签的分页时,能直接显示该标签视图。


解决方案

1. 修改Controller,添加激活标签参数

在List方法中新增activeTab参数,用于接收当前激活的标签,并将其存入ViewBag供前端使用,同时简化冗余的判断逻辑:

public async Task<IActionResult> List(int? page, int? pagePast, string activeTab = "presentRecord")
{
    var pageNumber = page ?? 1;
    var pageNumberPast = pagePast ?? 1;
    
    XCardViewModel viewModel = await _mediator.Send(new GetXQuery());
    ViewBag.presentPageCount = viewModel.X;
    
    XCardViewModel pastViewModel = await _mediator.Send(new GetPastXQuery());
    ViewBag.pastPageCount = pastViewModel.PastX;
    
    // 直接生成分页列表,无需冗余判断
    ViewBag.PageList = viewModel.X.ToPagedList(pageNumber, 5);
    ViewBag.PastPageList = pastViewModel.PastX.ToPagedList(pageNumberPast, 5);
    
    // 传递当前激活的标签标识
    ViewBag.ActiveTab = activeTab;
    
    return View(viewModel);
}

2. 修正前端标签内容容器结构

将两类记录分别放入对应ID的容器中,并添加city类,确保openTab函数能正确控制显示隐藏;同时修改分页链接,携带当前激活标签的参数:

<div class="tabbarClass">
    <a class="card" href="javascript:void(0)" onclick="openTab(event, 'presentRecord');">
        <div class="w3-third tablink w3-bottombar w3-hover-light-grey w3-padding w3-border-blue">
            <h2>Current Records</h2>
        </div>
    </a>
    <a class="card" href="javascript:void(0)" onclick="openTab(event, 'pastRecord');">
        <div class="w3-third tablink w3-bottombar w3-hover-light-grey w3-padding">
            <h2>Past Records</h2>
        </div>    
    </a>  
</div>

<!-- 当前记录容器 -->
<div id="presentRecord" class="city">
    @foreach (var item in ViewBag.PageList)
    {
        @item.Header
    }
    <div id="paginationOrder">
        @Html.PagedListPager( (IPagedList)ViewBag.PageList, page => Url.Action("List", new { page, activeTab = "presentRecord" }), new PagedListRenderOptions {   })
    </div>
</div>

<!-- 历史记录容器(默认隐藏) -->
<div id="pastRecord" class="city" style="display:none;">
    @foreach (var item in ViewBag.PastPageList)
    {
        @item.Header
    }
    <div id="pastpaginationOrder">
        @Html.PagedListPager( (IPagedList)ViewBag.PastPageList, pagePast => Url.Action("List", new { pagePast, activeTab = "pastRecord" }), new PagedListRenderOptions {   })
    </div>
</div>

3. 修改JavaScript,页面加载时自动激活对应标签

添加页面加载逻辑,根据ViewBag传递的ActiveTab自动激活目标标签,同时简化分页显示的判断逻辑:

<script>
    var presentPage = '@ViewBag.presentPageCount.Count';
    const pageModal = document.querySelector("#paginationOrder");     
    if(presentPage <= 5){
        pageModal.style.display = "none";
    }

    var pastPage = '@ViewBag.pastPageCount.Count';
    const pastpageModal = document.querySelector("#pastpaginationOrder");
    if (pastPage <= 5) {
        pastpageModal.style.display = "none";
    }
    
    function openTab(evt, tableID) {
        var i, x, tablinks;
        x = document.getElementsByClassName("city");
        for (i = 0; i < x.length; i++) {
            x[i].style.display = "none";
        }
        tablinks = document.getElementsByClassName("tablink");
        for (i = 0; i < tablinks.length; i++) {
            tablinks[i].className = tablinks[i].className.replace(" w3-border-blue", "");
        }
        document.getElementById(tableID).style.display = "block";
        evt.currentTarget.firstElementChild.className += " w3-border-blue";
    }

    // 页面加载时自动激活对应标签
    window.onload = function() {
        var activeTab = '@ViewBag.ActiveTab';
        if(activeTab) {
            // 模拟点击对应标签元素
            var tabElement = document.querySelector(`a[onclick="openTab(event, '${activeTab}')"]`);
            if(tabElement) {
                tabElement.click();
            }
        }
    }
</script>

内容的提问来源于stack exchange,提问作者i13k32

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:25:22