首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET核心Web :按查询参数路由

问ASP.NET核心Web :按查询参数路由
EN

Stack Overflow用户
提问于 2022-01-08 12:17:55
回答 3查看 9.3K关注 0票数 2

我来自一个沉重的Java/Spring背景,并试图将一些知识转移到ASP.NET核心6。

在Spring中,在RestController上,我能够根据查询参数的存在来路由请求。

因此,具有uri:/students?firstName=Kevin的/students?firstName=Kevin可以被路由到与uri:/students的HttpRequest不同的控制器方法。

在Web 6中,在阅读了一些示例并阅读了ASP.NET的文档之后,我无法确定等效的内容是否可行。

以下是我正在尝试实现的目标,这是否可能使用两种方法和路由配置来根据查询参数来区分要调用哪个控制器方法?

代码语言:javascript
复制
 [ApiController]
 [Route("Students")]
 public class StudentHomeProfileController : ControllerBase
 {
    [HttpGet] //Route here when no parameters provided
    public async Task<ActionResult<IEnumerable<Student>>> GetStudentAsync()
    {
        /* Code omitted */
    }

    [HttpGet] //Route here when firstName query param provided
    public async Task<ActionResult<IEnumerable<Student>>> SearchStudentAsync([FromQuery] string firstName)
    {
        /* Code omitted */
    }
 }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-08 12:28:43

您正在尝试使用query params来区分API调用。这不是做这个的方法。如果您想分离调用,则可能应该使用path params。

在核心- https://learn.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-6.0中阅读更多关于路由的信息

票数 2
EN

Stack Overflow用户

发布于 2022-02-22 06:21:08

虽然按查询参数进行筛选并不是随ASP.NET核心一起提供的,但是单独提供这个功能并不太困难。

在可扩展性方面,ASP.NET有一些超能力,其中之一是IActionConstraint,它

支持条件逻辑,以确定关联操作是否有效,以便为给定请求选择。(来源)

创建一个注释来筛选查询参数是非常容易的

代码语言:javascript
复制
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class QueryParameterConstraintAttribute : Attribute, IActionConstraint
{
    private readonly string _parameterName;

    public QueryParameterConstraintAttribute(string parameterName)
    {
        this._parameterName = parameterName;
    }

    public bool Accept(ActionConstraintContext context)
    {
        return context.RouteContext.HttpContext.Request.Query.Keys.Contains(this._parameterName);
    }

    public int Order { get; }
}

剩下的就是用这个约束注释控制器方法

代码语言:javascript
复制
[HttpGet] //Route here when firstName query param provided
[QueryParameterConstraint("firstName")]
public async Task<ActionResult<IEnumerable<Student>>> SearchStudentAsync([FromQuery] string firstName)
{
    /* Code omitted */
}

在一个快速测试中,我能够确认它似乎按照预期工作,即使您为不同的查询参数添加了这些属性中的多个(如果所有条件匹配,则调用路由)。

(请注意,这是用.NET Core2.1测试的。不管怎么说,.NET 6也是一样的)

票数 6
EN

Stack Overflow用户

发布于 2022-01-08 12:25:31

我认为您正在寻找类似的东西,您需要在"HttpGet“属性中指定参数

https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-6.0#attribute-routing-with-http-verb-attributes

代码语言:javascript
复制
[Route("api/[controller]")]
[ApiController]
public class Test2Controller : ControllerBase
{
    [HttpGet]   // GET /api/test2
    public IActionResult ListProducts()
    {
        return ControllerContext.MyDisplayRouteInfo();
    }

    [HttpGet("{id}")]   // GET /api/test2/xyz
    public IActionResult GetProduct(string id)
    {
       return ControllerContext.MyDisplayRouteInfo(id);
    }

    [HttpGet("int/{id:int}")] // GET /api/test2/int/3
    public IActionResult GetIntProduct(int id)
    {
        return ControllerContext.MyDisplayRouteInfo(id);
    }

    [HttpGet("int2/{id}")]  // GET /api/test2/int2/3
    public IActionResult GetInt2Product(int id)
    {
        return ControllerContext.MyDisplayRouteInfo(id);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70632225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档