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

Razor Post方法返回页面时定位指定位置并显示模态框问题

问题与解决方案

问题概述

点击页面中的编辑按钮后,页面通过POST提交并填充模态框表单,返回页面时模态框能显示,但存在两个问题:

  • 页面会自动回到顶部,无法定位到点击按钮的位置
  • 尝试通过JavaScript修改URL添加锚点实现定位时,模态框仅显示1秒就消失

已知限制:RedirectToPage支持fragment参数但会重置页面状态,不符合需求;return Page()无法直接设置锚点。

简易解决方案

核心思路:避免通过修改URL触发页面刷新,直接用DOM API完成页面定位,同时保持模态框状态。

1. 修正后端代码(.cs文件)

修改TempData存储的锚点信息,只保留锚点ID的数值:

public IActionResult OnPostDisplayEdit(int id, string email,string AttorneyRole,int pAttorneyRoleID,int pAttorney,int pEditAttorneyUserID,int PageFragment)
{
    // 原有业务逻辑保持不变
    EditUserEmailInput = email;
    string curDictionaryAttorneyRole;
    if (AttorneyRole.Contains('('))
    {
        curDictionaryAttorneyRole = AttorneyRole.Split(new[] { '(' }, 2)[0].Trim();
        EditUserPartyInput = AttorneyRole.Split(new[] { '(' }, 2)[1];
        var LastRightParenIndex = EditUserPartyInput.LastIndexOf(')');
        EditUserPartyInput = EditUserPartyInput.Substring(0, LastRightParenIndex);
    }
    else
    {
        curDictionaryAttorneyRole = AttorneyRole;
        EditUserPartyInput = null;
    }

    // 修改此处:只存储锚点ID数值
    TempData["EditingParty"] = "Yes";
    TempData["EndOfURL"] = PageFragment.ToString(); 

    // 原有业务逻辑保持不变
    SetFileSequenceField();
    ModelState.Clear();
    SetAttorneyRoleList();
    var selectedIndex = AttorneyRolesList.Where(arl => arl.AttorneyRole == curDictionaryAttorneyRole).Select(arl => arl.AttorneyRoleID).FirstOrDefault();
    AttorneyRoleIDEditForm = selectedIndex;
    EditAttorneyUserID = pEditAttorneyUserID;
    UneditedEmail = email;
    UneditedAttorneyRoleID = pAttorneyRoleID;
    PopulateUserList();

    return Page();
}

2. 重写前端JavaScript逻辑

删除URL跳转逻辑,改用scrollIntoView实现页面定位,避免页面刷新:

function OnLoad() {
    if ("@TempData["EditingParty"]" == "Yes") {
        const targetAnchorId = "@TempData["EndOfURL"]";
        const anchorElement = document.getElementById(targetAnchorId);
        
        // 定位到点击位置的锚点
        if (anchorElement) {
            // smooth参数可选,实现平滑滚动,去掉则直接跳转
            anchorElement.scrollIntoView({ behavior: 'smooth', block: 'center' });
        }
        
        // 显示模态框
        document.getElementById("EditUsersForm").style.display = "inline-block";
    } else {
        document.getElementById("EditUsersForm").style.display = "none";
    }
}

3. 验证锚点元素

你的CSHTML中已经存在<a id="@i"></a>,确保按钮的asp-route-PageFragment="@i"与锚点ID对应即可,无需额外修改。

原问题原因分析

之前用location.href修改URL的方式会触发浏览器重新加载页面,导致刚显示的模态框因为页面刷新而消失。而scrollIntoView是在当前页面的DOM环境内完成滚动,不会触发刷新,因此模态框能保持显示,同时完成定位需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:57:17