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

如何使用单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:13:12