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

时间:2019-01-30 17:00:32

标签: asp.net-core asp.net-core-2.2 asp.net-core-routing

在Asp.net WebApi2中

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

具有可选参数的操作。

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

在Asp.net Core中

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

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

Contoller

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

3 个答案:

答案 0 :(得分:1)

虽然不理想,但这是一个临时错号,直到您可以更新客户端呼叫为止。您可以尝试此操作,如果,可以假定您必须具有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" };

    }

答案 1 :(得分:0)

您的URI没有关注的RESTful惯例。坦白说,我一开始看不到您是如何完成这项工作的,因为同样的问题本应导致ASP.NET Web Api出现,但是您很可能很幸运地意识到在ASP.NET中完成路由的方式网络Api。 ASP.NET核心手柄路由完全不同。

无论如何,对于多个产品的列表中选择一个路线应的的包含在实际的URI的ID。换句话说:

df3 <- data.frame(PLOT = c(82708, 88503, 86560, 89773, 82199, 84113), CONDID = c(1, 2, 1, 1, 1, 1))
df3

有关的东西等的过滤,排序等的多条记录,这些应该是查询字符串的一部分。这包括像/api/values - Multiple values /api/values/{id} - Single value

startRecordId

消除路线中的歧义,您将没有任何问题。长和短,即使在一个路径段中它是可选的,也不能有两个路径都在同一路径段中接受/api/values?startRecordId={id} 。将Guid移到查询字符串中,无论如何这都是正确的方法,您一切顺利。

答案 2 :(得分:0)

您可以组合动作并根据提供的值来更改行为;

    //https://localhost:44323/api/values/9b858599-7639-45da-acd6-a1323fb019b5
    //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)
    {
        if (startRecordId.HasValue && !maxRecords.HasValue)
            return "value";
        else
            return new string[] { "value1", "value2" };

    }