C# Razor Pages应用无法访问路由数据问题求助
问题原因
你的页面位于Pages/Search/Index.cshtml,Razor Pages默认路由规则是/Search/Index(对应文件夹+文件名)。当你把@page改成@page "{term}"时,实际生成的路由是/Search/Index/{term},而非你期望的/search/{term},所以访问/search/foo时无法匹配到正确路由,自然拿不到参数。
解决方案
1. 修正路由模板
修改Search/Index.cshtml顶部的@page指令,直接指定完整路由模板,覆盖默认规则:
@page "/search/{term}" @model SearchModel @{ ViewData["Title"] = "Search"; }
2. 确保参数正确绑定到PageModel
有两种常用方式实现参数绑定:
方式一:给属性添加路由绑定标记
在PageModel的Term属性上添加[FromRoute]特性,明确指定从路由参数获取值(原[BindProperty(SupportsGet = true)]主要用于查询字符串/表单绑定):
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc; using ChowderForkWeb.Service; using ChowderForkWeb.Model; namespace MyApp.Pages; public class SearchModel : PageModel { public List<Post> posts = new(); [BindProperty(SupportsGet = true)] [FromRoute(Name = "term")] // 新增:指定从路由参数"term"绑定 public string Term { get; set; } public void OnGet() { var svc = new PostService(); posts = svc.Search(Term); } }
方式二:直接在OnGet方法中接收参数
更简洁的方式是在OnGet方法参数中直接声明路由参数,ASP.NET Core会自动绑定:
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc; using ChowderForkWeb.Service; using ChowderForkWeb.Model; namespace MyApp.Pages; public class SearchModel : PageModel { public List<Post> posts = new(); public string Term { get; set; } // 保留属性用于页面显示 public void OnGet(string term) // 直接接收路由参数"term" { Term = term; var svc = new PostService(); posts = svc.Search(Term); } }
3. 验证路由匹配
修改完成后重启应用,访问/search/foo即可正常获取到foo作为搜索参数。如果需要同时支持/search?term=foo和/search/foo两种方式,方式一的绑定方式会自动兼容(BindProperty(SupportsGet=true)处理查询字符串,FromRoute处理路由参数)。
内容的提问来源于stack exchange,提问作者danalyst
相关产品推荐
相关产品推荐

