c# - 具有多个可选参数调用不同操作的 Asp.net 核心路由

标签 c# asp.net-core asp.net-core-2.2 asp.net-core-routing

在 Asp.net WebApi2 中

当调用 api/values/9b858599-7639-45da-acd6-a1323fb019b5 时,将调用 get 操作。

带有可选参数的 Action 。

当 api/values/9b858599-7639-45da-acd6-a1323fb019b5?maxRecords=100 或 api/values/?maxRecords=100 调用 GetProducts 操作。

在 Asp.net Core 中

但是在 asp.net core 中,当调用 api/values/9b858599-7639-45da-acd6-a1323fb019b5 时,将调用 GetProducts 操作。我想在不更改现有 url 的情况下调用 Get 操作。

如何在 Asp.net core 2.0 中解决这个问题

Controller

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    //https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5
    [HttpGet("{productId:Guid}", Order = 1)]
    public ActionResult<string> Get(Guid productId)
    {
        return "value1";
    }


    //https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5?maxRecords=100
    //https://localhost:44323/api/values/?maxRecords=100
    [HttpGet("{startRecordId:Guid?}")]
    public ActionResult<IEnumerable<string>> GetProducts(Guid? startRecordId, int maxRecords, DateTimeOffset? minimumChangeDate = null)
    {
        return new string[] { "value1", "value2" };

    }

}

Startup.cs

app.UseMvc(routes =>
        {
            routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
            routes.MapRoute("DefaultApi", "api/{controller}/{id?}");
        });

最佳答案

虽然不理想,但这是一个临时鞋拔,直​​到您可以更新客户端调用。您可以试试这个,如果您可以假设您必须有一个 maxRecords QueryString。因为如果它默认为 0,它就没用了,除非你在它为 0 的情况下有适当的逻辑。

    //https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5
    [HttpGet("{productId:Guid}", Order = 1)]
    public ActionResult<string> Get(Guid productId)
    {
        return "value1";
    }


    //https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5?maxRecords=100
    //https://localhost:44323/api/values/?maxRecords=100
    [HttpGet("{startRecordId:Guid?}")]
    public ActionResult<IEnumerable<string>> GetProducts(Guid? startRecordId, [FromQuery] int maxRecords, [FromQuery] DateTimeOffset? minimumChangeDate = null)
    {
        if (!Request.GetDisplayUrl().Contains(nameof(maxRecords)) &&
            startRecordId.HasValue)
        {
            return Get(startRecordId.Value);
        }

        return new string[] { "value1", "value2" };

    }

关于c# - 具有多个可选参数调用不同操作的 Asp.net 核心路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54445757/

相关文章:

c# - Win32 API LogonUser 离线访问本地账户

c# - 无法从派生自 ActionFilterAttribute 的类访问存储库(或 DbContext)

C# do..while 循环列表

c# - 如何拦截所有按键事件,包括 ctrl+alt+del 和 ctrl+tab?

javascript - 如何使用 JavaScript 插入新的表单行并将其包含在传递给 Controller ​​的内容中?

c# - 如何在 ASP. NET Core 中使用 jquery

c# - PostgreSQL : 42883: operator does not exist: information_schema. sql_identifier + 未知

c# - BadHttpRequestException : Reading the request body timed out due to data arriving too slowly. 请参阅 ASP.NET 核心 2.2 上的 MinRequestBodyDataRate

c# - 缩小 YUV 4 :2:2 的算法

c# - 下面的PUT方法代码中是否需要int id?