Asp.Net Core 2 Razor AddPageRoute:如何向模型传递ID等信息?
我来帮你搞定这个问题~你遇到的核心问题是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

