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

Asp.Net Core 2 Razor AddPageRoute:如何向模型传递ID等信息?

解决ASP.NET Core页面路由传参到Page Model的问题

我来帮你搞定这个问题~你遇到的核心问题是AddPageRoute的第一个参数只接受合法的页面相对路径,不能直接带查询字符串(?handler=Pageid&id=10这种格式不被路由系统识别),所以第一种配置匹配不到对应的页面,才会显示空白。下面给你两种简单直接的实现方案:

方案一:利用路由约定绑定默认参数(最贴合你的需求)

你可以通过AddPageRoute的第三个参数,直接指定要传递给页面的handler和id参数,这样友好URL会自动映射到带参数的页面请求。

在Startup.cs(或Program.cs的配置段)里修改路由约定:

options.Conventions.AddPageRoute("/News", "News/2018/Jan", new { handler = "Pageid", id = 10 });
options.Conventions.AddPageRoute("/News", "News/2018/Feb", new { handler = "Pageid", id = 11 });
options.Conventions.AddPageRoute("/News", "News/2018/Mar", new { handler = "Pageid", id = 12 });

你的Page Model里的OnGetPageid方法完全不用改:

public void OnGetPageid(int id) {
    // 这里可以正常拿到id的值(10、11、12),继续你的业务逻辑就行
}

当用户访问News/2018/Jan时,系统会自动把请求映射到/News?handler=Pageid&id=10,触发对应的handler方法。

方案二:自定义页面路由模板(更灵活的场景)

如果你的友好URL里的年份、月份本身有业务意义,也可以直接从URL路径里提取参数,不用硬绑定id:

首先在News页面的.cshtml顶部添加路由模板:

@page "{year:int}/{month:alpha}"
@model NewsModel

然后修改Page Model的handler方法,直接接收路径参数:

public void OnGet(int year, string month) {
    // 根据月份映射到对应的id,比如Jan对应10,Feb对应11
    int id = month switch {
        "Jan" => 10,
        "Feb" => 11,
        "Mar" => 12,
        _ => 0 // 默认值
    };
    // 后续业务逻辑处理
}

这种方式不需要在路由约定里添加多条规则,只要URL符合News/2018/Jan的格式,就会自动匹配页面并传递参数。

为什么原来的配置无效?

再给你解释下原因:AddPageRoute的第一个参数要求是页面的相对路径(比如/News),不能包含查询字符串。你之前写的/News?handler=Pageid&id=10属于带查询参数的请求URL,不是合法的页面路径,所以路由系统无法匹配到对应的页面,导致显示空白。而第二种直接映射/News的配置能生效,是因为路径合法,但没有传递参数的机制。

内容的提问来源于stack exchange,提问作者Marshall Penn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:02:10