Url.Page()无法为带参数的默认Handler生成URL的问题求助
问题:ASP.NET Core Razor页面无法生成不带Handler且带参数的URL
在ASP.NET Core Web应用的Razor页面中,配置了包含{handler?}和参数的路由模板@page "{handler?}/{name?}",使用Url.Page()生成URL或返回Redirect()时,指定PageHandler的场景一切正常,但无法生成不带PageHandler且带参数的URL(如/Things/View?name=test)。
示例代码
Razor页面(View.cshtml)
@page "{handler?}/{name?}" @model WebApplication1.Pages.Things.ViewModel <p>@Html.DisplayFor(m => m.Name)</p> <p>@Html.DisplayFor(m => m.TestUrl)</p>
后台PageModel代码
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace WebApplication1.Pages.Things { public class ViewModel : PageModel { public string Name { get; set; } = ""; public string TestUrl { get; set; } = ""; public void OnGet(string? name) { Name = name ?? "-- none --"; // 原代码无法生成目标URL TestUrl = Url.Page("View", new { name }) ?? "-- no url --"; } public void OnGetYellow(string? name) { Name = $"Yellow {name ?? "-- noname --"}"; TestUrl = Url.Page("View", pageHandler: "Yellow", new { name }) ?? "-- no url --"; } } }
测试结果
| 测试URL | 页面生成的URL |
|---|---|
| https://localhost:7066/Things/View/Yellow/test | /Things/View/Yellow/test |
| https://localhost:7066/Things/View/Yellow?name=test | /Things/View/Yellow/test |
| https://localhost:7066/Things/View/Yellow | /Things/View/Yellow |
| https://localhost:7066/Things/View | /Things/View |
| https://localhost:7066/Things/View?name=test | -- no url -- |
解决方案
要生成不带PageHandler但带查询参数的URL,需要显式指定pageHandler: null,让路由系统明确跳过handler路径段,将参数以查询字符串形式附加。
修改OnGet方法中的Url.Page调用:
TestUrl = Url.Page("View", pageHandler: null, new { name }) ?? "-- no url --";
修改后,当访问https://localhost:7066/Things/View?name=test时,页面会正确生成/Things/View?name=test的URL。
原因是默认情况下,路由系统会尝试将传入的name参数匹配到路由模板的{handler?}段,导致路由匹配失败;显式设置pageHandler: null后,路由系统会忽略handler路径段,将name作为查询参数处理。
内容的提问来源于stack exchange,提问作者H. de Jonge
相关产品推荐
相关产品推荐

