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

Razor Page页面跳转返回后如何保留原页面滚动条位置

Razor Page跳转返回保留滚动条位置实现方案

优先推荐:Cookie+纯JS实现(无需修改后端逻辑,开发成本最低)

该方案直接解决你提到的Cookie操作疑问,不需要调整原有C#代码,适配所有跳转场景。

步骤1:A页跳转前保存滚动位置

给你原有跳转B页的a标签添加自定义类jump-to-b:

<a asp-page="./ViewBorad" asp-route-boradid="@Model.borad_tbl[i].tbl_Board.board_id" class="jump-to-b">跳转</a>

在A页添加JS代码:

// 监听所有跳转B页的点击事件
document.querySelectorAll('.jump-to-b').forEach(link => {
  link.addEventListener('click', () => {
    // 获取当前页面滚动距离
    const scrollPos = window.pageYOffset || document.documentElement.scrollTop;
    // 写入Cookie,有效期1天,站点全局生效
    document.cookie = `a_scroll_pos=${scrollPos}; max-age=86400; path=/`;
  });
});

步骤2:A页加载时恢复滚动位置

在A页底部添加JS代码,页面加载完成后读取Cookie恢复位置:

window.addEventListener('load', () => {
  // 提取Cookie中的滚动位置
  const cookieList = document.cookie.split('; ');
  const scrollCookie = cookieList.find(c => c.startsWith('a_scroll_pos='));
  if (scrollCookie) {
    const targetPos = parseInt(scrollCookie.split('=')[1]);
    window.scrollTo(0, targetPos);
    // 用完即删Cookie,避免下次进入A页错误跳转
    document.cookie = 'a_scroll_pos=; max-age=0; path=/';
  }
});

备选方案:基于TempData+BindProperty实现(匹配你最初的开发思路)

直接解决你提到的两个核心问题:

1. 跳转时将滚动值存入后端属性

你不能通过默认的asp-page标签直接传递动态滚动值,需要配合JS提交表单传递参数:
首先在A页添加隐藏表单:

<form id="jumpToBForm" method="get" asp-page="./ViewBorad">
  <input type="hidden" name="boradid" id="hiddenBoardId" />
  <input type="hidden" name="scrollPos" id="hiddenScrollPos" />
</form>
<!-- 原有a标签调整为触发JS提交 -->
<a href="javascript:void(0)" class="jump-link" data-boardid="@Model.borad_tbl[i].tbl_Board.board_id">跳转</a>

添加JS提交逻辑:

document.querySelectorAll('.jump-link').forEach(link => {
  link.addEventListener('click', function() {
    // 填充表单参数
    document.getElementById('hiddenBoardId').value = this.dataset.boardid;
    document.getElementById('hiddenScrollPos').value = window.pageYOffset || document.documentElement.scrollTop;
    // 提交表单跳转
    document.getElementById('jumpToBForm').submit();
  });
});

在B页的OnGet方法中接收滚动位置并存入TempData:

public IActionResult OnGet(int boradid, int scrollPos)
{
    TempData["ScrollPosition"] = scrollPos;
    // 保留你原有B页的业务逻辑
    return Page();
}

A页的后端代码你原有逻辑即可正常使用:

[BindProperty(SupportsGet = true)]
public int ScrollPosition { get; set; }
public IActionResult OnGet()
{
    if (TempData["ScrollPosition"] != null)
    {
        ScrollPosition = (int)TempData["ScrollPosition"];
    }
    // 保留你原有A页的业务逻辑
    return Page();
}

2. JS访问BindProperty属性值

直接在Razor视图中通过Razor语法将后端属性值输出给JS变量即可:

window.addEventListener('load', () => {
  const targetScrollPos = @Model.ScrollPosition;
  if (targetScrollPos > 0) {
    window.scrollTo(0, targetScrollPos);
  }
});

提交按钮跳转逻辑修复

你原有提交按钮用history.go(-1)会跳过重载逻辑,调整为提交后重定向回A页即可:

// B页的ChangeComplete处理方法
public IActionResult OnPostChangeComplete()
{
    // 保留你原有业务逻辑
    return RedirectToPage("./你A页的页面名称");
}

内容的提问来源于stack exchange,提问作者로다현

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:45:02