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

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) {
        ...
    });
});

尝试转义&为&amp;或%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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:42:39