在 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/