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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:18:28