Razor Pages命名页面处理程序中参数值为何为Null?
Razor Pages命名处理程序参数为Null的解决方法
问题场景
在.NET 7的ASP.NET Core Web应用中使用Razor Pages,在默认OnGetAsync处理程序外添加了如下命名页面处理程序:
public async Task<IActionResult> OnGetGetStatesAsync(string country) { ... }
通过以下JavaScript调用该方法时,页面处理程序能被触发,但country参数始终为Null:
$('.js-select-country').change(function (e) { var url = "MyPage?handler=getStates&country=US"; $.getJSON(url, function (data) { ... }); });
尝试转义&为&或%26时,要么参数仍为Null,要么触发默认OnGetAsync;改用路由形式getStates/US并标记[FromRoute]时,会调用错误的方法。
解决方案
方法1:修正查询字符串构造(推荐)
Razor Pages的参数绑定依赖参数名大小写匹配,同时需确保URL路径正确,无需转义&:
- 保持C#参数名
country与查询字符串参数名一致 - 用
Url.Page生成正确的处理程序URL,避免路径错误
修改JavaScript代码:
$('.js-select-country').change(function (e) { // 实际场景可替换为$(this).val()获取选中值 var country = "US"; // 自动生成带handler的正确URL var url = '@Url.Page("MyPage", "getStates")' + '?country=' + country; $.getJSON(url, function (data) { ... }); });
C#代码保持不变(默认从查询字符串绑定参数):
public async Task<IActionResult> OnGetGetStatesAsync(string country) { // 此时country参数可正常获取值 ... }
方法2:使用路由参数传递
若要通过路由传递参数,需先在页面的@page指令中定义路由模板:
@page "{handler?}/{country?}"
修改C#方法,添加[FromRoute]特性并确保handler名称匹配:
public async Task<IActionResult> OnGetGetStatesAsync([FromRoute] string country) { ... }
对应的JavaScript URL改为:
var url = "MyPage/getStates/US";
注意:Razor Pages会将
OnGetXxxAsync中的Xxx转为小写作为handler名称,需确保URL中的getStates与方法后缀GetStates对应。
常见排查点
- 参数大小写:模型绑定默认区分大小写,查询字符串/路由参数名需与C#参数名完全一致
- URL路径:页面不在根目录时,直接写
MyPage会导致路径错误,推荐用Url.Page生成路径 - handler名称:命名处理程序的名称是
OnGet后的部分(如OnGetGetStatesAsync对应getStates),需确保URL中的handler参数正确
内容的提问来源于stack exchange,提问作者ngruson
相关产品推荐
相关产品推荐

