Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以调用action方法(从action方法)并让ASP.Net Core注入[FromQuery]参数吗?_C#_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

C# 可以调用action方法(从action方法)并让ASP.Net Core注入[FromQuery]参数吗?

C# 可以调用action方法(从action方法)并让ASP.Net Core注入[FromQuery]参数吗?,c#,asp.net-core,asp.net-core-webapi,C#,Asp.net Core,Asp.net Core Webapi,我有一个路由/my/route?t=something&…,它由一个操作方法处理,然后该操作方法打开t,并调用适当的子例程来执行任何需要执行的操作。例如: [HttpGet("my/route")] public IActionResult GetStuff([FromQuery(Name = "t")]string searchType) { switch (searchType) { case "type1": return getSt

我有一个路由
/my/route?t=something&…
,它由一个操作方法处理,然后该操作方法打开
t
,并调用适当的子例程来执行任何需要执行的操作。例如:

[HttpGet("my/route")]
public IActionResult GetStuff([FromQuery(Name = "t")]string searchType)
{
    switch (searchType)
    {
        case "type1":
            return getStuff_type1();
        case "type2":
            return getStuff_type2();
        default:
            return BadRequest();
    }
}
但是,每个子例程都需要其他查询参数(根据子例程的需要,其中一些/许多参数可能会有所不同)

因此,
“type1”
可以接受查询参数“a”、“b”、“c”、“d”;而
“type2”
可以接受查询参数“v”、“w”、“x”、“y”、“z”

显然,我可以将所有参数(abcdvwxyz,对于其他类型,还有更多参数)拉入主操作方法
GetStuff
,并根据需要将它们传递到子例程中,但这很麻烦。。如果我能以某种方式调用子例程,让它们指定所需的查询参数,这样main
GetStuff
就不必在意了(这可能需要使用一些ASP.Net核心IoC功能来实现子例程的
[FromQuery]
参数),那就太好了

另一个选项是,子例程只需使用
Request.Query
获取它们所需的参数,但这不会声明/记录例程的输入值,这对于测试或代码清晰度来说都不太好


问题是,ASP.Net Core是否具有允许将请求传递给另一个特定操作方法(并完成任何必要的依赖注入)的功能?简单地说,没有。但是,所有操作参数都是可选的(如果没有提供,将用默认值填充),因此,建议只接受所有参数的方法可能是您的最佳选择。如果这是不可接受的,您可以退回到手动从
Request.Query
中获取它们,但您需要使用它进行自己的验证/绑定(它们都只是字符串)

也就是说,根据您的问题描述,您的最佳选择是实际使用单独的路由。实际上,您正在为请求资源映射应该如何与HTTP一起工作而争论。如果您有不同类型的搜索,每个搜索都需要不同的参数,那么这些可以被视为每个唯一的资源。每个人都在做不同的事情,需要不同的投入。考虑一个较低级别的示例,您直接在域模型上执行所有这些操作,而不使用HTTP层。你会如何处理这个逻辑?您是否只有一种方法来处理所有可能的搜索类型?可能不会。即使您这样做了,在这种情况下,您将如何提供参数?您是否仍然需要允许提供所有可能的参数


长话短说,我会删除这个代理操作,并将每个单独的搜索类型方法公开为一个操作。搜索类型可以是路由参数。然后,如果您真的愿意,您仍然可以使用代理操作,只需从查询中获取搜索类型并重定向到相应的搜索类型路由,以及查询的其余部分。

是的,我同意使用唯一路由更好。。那是(现在仍然是)我的第一选择。我在玩弄不同的做事方式(同时弄清楚我的API路由设计),我很好奇这个功能是否可行。感谢您的回答和鼓励,让我们继续使用不同的路线(虽然我还不能完全确定我的路线模式,但这是另一个问题)。