使用区域时如何使 RedirectToPage 工作

How to make the RedirectToPage work When Using Areas

我正在开发用于测试的 .NET 6 Web 应用程序,运行 在使用区域时遇到 Razor 页面中的 RedirectToPage 问题。详情如下。

测试环境

ASP.NET 框架:.NET 6 应用程序模式:Razor 页面(无 MVC) 身份验证:使用简单的 cookie IDE: Visual Studio 2022 开发机器:Windows11

项目结构

MyProject
    Areas
        |----Public
                |----Pages
                ......
                
        |----Internal
                |----Pages
                        |---- Index.cshtml
                        |---- Authenticate
                                |---- UserLogin.cshtml
                                      UserLogin.cs
                        |---- Products
                        |---- Services
                           
    Pages
        |---- Shared
        |---- Index.cshtml
        |---- Error.cshtml

问题描述

用户在 UserLogin.cshtml 页面提供凭据后,UserLogin.cs class 中的“OnPost”方法将处理验证。如果登录成功,它应该将用户重定向到内部区域根目录中的Index.cshtml页面(见下面的代码段)。

我尝试了不同的方法来在 RedirectToPage 语句中指定页面名称。但是,其中 none 有效。 (注意:使用浏览器,我可以使用 url"http://localhost:12345/Internal/Index")

访问索引页面
"Index"
"/Index"
"./Index"
"/Internal/Index" (without using 2nd input param)
"./Internal/Index" (without using 2nd input param)
public async Task<IActionResult> OnPost()
{
    // verify user ID and password against DB
    bool IsVerified = CheckUserLogin(LoginUser.UserId, LoginUser.Password);

    if (IsVerified)
    {
        var claims = new List<Claim>();
        claims.Add(new Claim("username", LoginUser.UserId));
        claims.Add(new Claim(ClaimTypes.NameIdentifier, LoginUser.UserId));

        // test statement for using name property in claim
        claims.Add(new Claim(ClaimTypes.Name, LoginUser.FullName));

        //test statements for using user role property in clain
        claims.Add(new Claim(ClaimTypes.Role, "admin,research"));

        var claimIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
        var claimPrinciple = new ClaimsPrincipal(claimIdentity);
        await HttpContext.SignInAsync(claimPrinciple);

        return RedirectToPage("Index", new { area = "Internal" });
    }
    return Page();
}

问题 在 RedirectToPage 语句中为 Area 下的 razor 页面指定“路由”的正确方法是什么?

根据你的结构,我建议你有两种选择:

选项 1:如果您使用 Razor View,请尝试 return RedirectToPage("../Index");

选项 2:如果您使用 Razor Page,请尝试 return RedirectToPage("/Index", new { area = "Internal" });