如何使用单个Index.cshtml处理两个不同的路由方法?
实现
Hello/{fullname}路由处理及相关逻辑 1. 修改Razor页面路由指令
在Index.cshtml顶部添加第二个路由模板,让页面同时匹配根路径和Hello/{fullname}路径,同时修正原三元表达式的语法错误:
@page "" @page "Hello/{fullname}" @model MyProject.Pages.IndexModel @{ ViewBag.Title = "index"; } <h2>@(string.IsNullOrWhiteSpace(Model.FullName) ? "Hi" : $"Hi, {Model.FullName}")</h2>
2. 扩展PageModel逻辑处理路由参数与令牌验证
修改后置类,注入IHttpContextAccessor以获取请求上下文,在OnGet方法中接收fullname参数,同时实现令牌验证逻辑:
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.RazorPages; public class IndexModel : PageModel { private readonly IHttpContextAccessor _httpContextAccessor; public string? FullName { get; set; } public IndexModel(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public void OnGet(string? fullname = null) { if (!string.IsNullOrWhiteSpace(fullname)) { FullName = fullname; // 从Cookie获取令牌(根据实际存储方式调整,比如请求头) var authToken = _httpContextAccessor.HttpContext?.Request.Cookies["AuthToken"]; if (!ValidateToken(authToken)) { ViewBag.IsTokenInvalid = true; FullName = null; } } } // 替换为实际的令牌验证逻辑(比如调用API或本地验证服务) private bool ValidateToken(string? token) { if (string.IsNullOrWhiteSpace(token)) return false; // 此处添加令牌有效性校验逻辑,比如解析JWT、调用验证接口等 return true; } }
注意:需要在Program.cs/Startup.cs中注册IHttpContextAccessor:
// Program.cs builder.Services.AddHttpContextAccessor();
3. 前端处理登录后URL修改与刷新弹窗
在Index.cshtml末尾添加脚本,处理登录成功后的URL更新,以及刷新页面时的登录弹窗逻辑:
<script> // 页面加载时检查令牌是否无效 window.addEventListener('load', () => { const isTokenInvalid = @(ViewBag.IsTokenInvalid ?? false); if (isTokenInvalid) { // 替换为你的登录模态框逻辑 alert('登录状态已过期,请重新登录'); } }); // 登录成功后的回调示例 function handleLoginSuccess(fullName, authToken) { // 存储令牌到Cookie,确保后端可获取 document.cookie = `AuthToken=${authToken}; path=/; SameSite=Lax;`; // 修改URL不触发页面刷新 history.pushState({}, '', `/Hello/${encodeURIComponent(fullName)}`); // 更新页面问候语 document.querySelector('h2').textContent = `Hi, ${fullName}`; } </script>
关键说明
- 路由优先级:Razor Pages会按
@page指令的顺序匹配路由,确保Hello/{fullname}能被正确识别 - 令牌存储:建议使用Cookie存储令牌(而非localStorage),这样后端在刷新页面时能直接获取到令牌进行验证
- 避免API路由冲突:若Web API使用
/api前缀,无需担心与页面路由/Hello/{fullname}冲突
内容的提问来源于stack exchange,提问作者Wim ten Brink
相关产品推荐
相关产品推荐

