.net core Razor页面中绑定查询参数的规则

.net core Razor页面中绑定查询参数的规则,.net-core,razor-pages,.net Core,Razor Pages,在Razor Pages中,如果你打电话,例如 http://localhost/foo?bar=42 在相应的模型中,bar键可在OnGet构造函数中自动访问 public IActionResult OnGet(int bar) { System.Console.WriteLine($"bar is {bar}"); } 但是如果查询参数是poo,该怎么办 http://localhost/foo?poo=42 然后在模型中,bar没有得到值42 非常简单,获取与查询参数键匹配

在Razor Pages中,如果你打电话,例如

http://localhost/foo?bar=42
在相应的模型中,
bar
键可在
OnGet
构造函数中自动访问

public IActionResult OnGet(int bar)
{
    System.Console.WriteLine($"bar is {bar}");
}
但是如果查询参数是
poo
,该怎么办

http://localhost/foo?poo=42
然后在模型中,
bar
没有得到值42

非常简单,获取与查询参数键匹配的变量。但是如果键被连字符连接了呢

http://localhost/foo?foo-bar=42
foobar
绝对不是可接受的变量名。如何访问此查询参数?这里有什么规定


在我的特定情况下,我除了接收这些连字号查询字符串参数之外,没有其他选择。另外,我在
.netcore2.2

Razor页面中最简单的解决方案是使用
Request.Query

public void OnGet()
{
    var data = Request.Query["foo-bar"];
}
我认为海芬是用下划线表示的,所以
foobar
变成了
foobar
,然而这与标准的C#命名约定背道而驰

无论如何,我不建议将查询参数绑定为处理程序参数。最干净的解决方案是在
PageModel
上定义一个属性,如下所示:

//来自Microsoft.AspNetCore.Mvc命名空间
[FromQuery(Name=“foo-bar”)]
公共字符串FooBar{get;set;}
这样,每当提供与该名称匹配的查询参数时,它都将被绑定。不管特定处理程序是否请求它。然后,您可以随时访问
PageModel
上的属性。因此,示例方法变为:

public void OnGet()
{
System.Console.WriteLine($“bar是{FooBar}”);
}