我正在开发一个简单的网站,并且有一个非常简单的索引页面:
@page
@model MyProject.Pages.IndexModel
@{
ViewBag.Title = "index";
}
<h2>@string.IsNullOrWhiteSpace(Model.FullName)??"Hi":$"Hi, {Model.FullName}"</h2>
嗯,还有更多,但这是唯一重要的部分。
现在,这也意味着我有两条路线:一条是 / 路线的正常 OnGet() 路线,第二条路线是“Hello/{fullname}”路线。是的,“Hello”部分是一个要求,因为该项目中还有一些 Web API 功能。
背后的代码也很简单:
public class IndexModel() : PageModel
{
public string? FullName { get; set; }
public void OnGet()
{
}
}
这并不太复杂,并且提供了 / 路线。但我该如何处理“Hello/{fullname} 路线?
请记住,这是此页面的简化版本。它里面有更多的代码来处理各种菜单并调用一些 API 函数等等。
我的问题还在于,这种布局是由我的管理层决定的,因此可能很糟糕,但我对此无能为力。
这背后的逻辑是页面允许用户登录,这是通过 API 调用发生的。所以,没有页面刷新。当用户登录时,JavaScript 会将 URL 从“http://localhost/”修改为“http://localhost/Hello/SomeName”。因此,如果用户刷新,该名称仍然可见,索引页面将显示用户名并检查登录令牌是否仍然有效。如果没有,则会再次弹出登录。
您可以将
FullName
值作为可为空的参数传递,并将其绑定到 FullName
属性。您需要进行的更改是:
在Program.cs
中为索引页面注册额外的路由模板builder.Services.AddRazorPages()
.AddRazorPagesOptions(options =>
{
options.Conventions.AddPageRoute("/Index", "Hello/{fullname?}");
});
向
BindProperty
类中的 FullName
属性添加 IndexModel
属性,确保它是 GET
请求中的绑定目标:
[BindProperty(SupportsGet = true)]
public string? FullName { get; set; }