首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个可选参数调用不同操作的Asp.net核心路由

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

Stack Overflow用户
提问于 2019-01-30 17:00:31
回答 3查看 10.3K关注 0票数 2

In Asp.net WebApi2

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

带有可选参数的操作。

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

在Asp.net核中的应用

但是在api/values/9b858599-7639-45da-acd6-a1323fb019b5内核中,当asp.net被调用时,GetProducts操作将被调用。我想在不改变现有网址的情况下给Get行动打电话。

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

Contoller

代码语言:javascript
复制
[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

代码语言:javascript
复制
app.UseMvc(routes =>
        {
            routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
            routes.MapRoute("DefaultApi", "api/{controller}/{id?}");
        });
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-14 19:48:13

虽然不理想,但这是暂时的,直到您可以更新客户端调用。您可以尝试这样做,,如果,您可以假设您必须有一个maxRecords QueryString。因为如果它默认为0,那么它是无用的,除非在0的情况下,逻辑已经到位。

代码语言:javascript
复制
    //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" };

    }
票数 6
EN

Stack Overflow用户

发布于 2019-01-30 18:50:47

您的URI没有遵循RESTful约定。坦率地说,我看不出您最初是如何完成这一工作的,因为同样的问题应该会导致ASP.NET Web,但是您可能只是对ASP.NET Web的路由方式感到幸运。ASP.NET核心完全不同地处理路由。

无论如何,多个产品列表的路由不应该包含实际URI中的id。换言之:

代码语言:javascript
复制
/api/values - Multiple values
/api/values/{id} - Single value

对于诸如过滤、排序等多条记录,这些记录应该是查询字符串的一部分。其中包括类似于startRecordId的内容

代码语言:javascript
复制
/api/values?startRecordId={id}

消除你路线上的歧义,你就没有问题了。长和短,您不能同时在相同的路径段中接受一个Guid,即使它在一个路径段上是可选的。将startRecordId移动到查询字符串中,这是进行查询的正确方法,您可以继续使用它。

票数 1
EN

Stack Overflow用户

发布于 2019-08-20 03:34:44

您可以组合您的操作,并根据参数提供的值来更改行为;

代码语言:javascript
复制
    //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" };

    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54445757

复制
相关文章

相似问题

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