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

Mov*_*vva 2 c# asp.net-core asp.net-core-routing asp.net-core-2.2

在 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 Action 时。

在 Asp.net Core 中

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

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

控制器

[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" };

    }

}
Run Code Online (Sandbox Code Playgroud)

启动文件

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

Gre*_*wen 5

虽然不理想,这是一个临时的鞋拔,直到您可以更新客户端调用。你可以试试这个,如果你可以假设你必须有一个 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" };

    }
Run Code Online (Sandbox Code Playgroud)