如何在.net core中调用带参数的动作?
How to call an action with parameters in .net core?
所以我在 Startup.cs 中设置了以下默认模式:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action}/{id?}");
});
这是我的控制器:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
[Route("[action]")]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 0),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
[HttpGet]
[Route("[action]")]
public IEnumerable<WeatherForecast> Grab()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(1, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
[Route("[action]")]
[HttpGet("{i:int}")]
public IEnumerable<WeatherForecast> Snatch(int i)
{
var rng = new Random();
return Enumerable.Range(i, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(55, 100),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
现在当我调用 https://localhost:44388/weatherforecast/grab
或 https://localhost:44388/weatherforecast/get
时它工作正常,但如果我调用 https://localhost:44388/weatherforecast/Snatch/1
然后我在我的浏览器中得到 Error: Cannot match any routes.
。
我已经将最后一个方法 Snatch 设置为它需要一个 int 的参数,所以我做错了什么?
您需要使用一个路由模板来获得所需的行为
//GET weatherforecast/Snatch/1
[Route("[action]/{i:int}")]
[HttpGet]
public IEnumerable<WeatherForecast> Snatch(int i) {
//...
}
现在,由于这是一个 ApiController
,所有操作仅使用 Http{Verb}
就足够了
When building a REST API, it's rare that you will want to use [Route(...)]
on an action method as the action will accept all HTTP methods. It's better to use the more specific Http*Verb*Attributes
to be precise about what your API supports. Clients of REST APIs are expected to know what paths and HTTP verbs map to specific logical operations.
//GET weatherforecast/Snatch/1
[HttpGet("[action]/{i:int}")]
public IEnumerable<WeatherForecast> Snatch(int i) {
//...
}
这可以通过聚合模板进一步简化
[ApiController]
[Route("[controller]/[action]")] //<-- NOTE THIS
public class WeatherForecastController : ControllerBase {
//...
//GET weatherforecast/get
[HttpGet]
public IEnumerable<WeatherForecast> Get() {
//...
}
//GET weatherforecast/grab
[HttpGet]
public IEnumerable<WeatherForecast> Grab() {
//...
}
//GET weatherforecast/Snatch/1
[HttpGet("{i:int}")]
public IEnumerable<WeatherForecast> Snatch(int i) {
//...
}
}
所以我在 Startup.cs 中设置了以下默认模式:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action}/{id?}");
});
这是我的控制器:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
[Route("[action]")]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 0),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
[HttpGet]
[Route("[action]")]
public IEnumerable<WeatherForecast> Grab()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(1, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
[Route("[action]")]
[HttpGet("{i:int}")]
public IEnumerable<WeatherForecast> Snatch(int i)
{
var rng = new Random();
return Enumerable.Range(i, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(55, 100),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
现在当我调用 https://localhost:44388/weatherforecast/grab
或 https://localhost:44388/weatherforecast/get
时它工作正常,但如果我调用 https://localhost:44388/weatherforecast/Snatch/1
然后我在我的浏览器中得到 Error: Cannot match any routes.
。
我已经将最后一个方法 Snatch 设置为它需要一个 int 的参数,所以我做错了什么?
您需要使用一个路由模板来获得所需的行为
//GET weatherforecast/Snatch/1
[Route("[action]/{i:int}")]
[HttpGet]
public IEnumerable<WeatherForecast> Snatch(int i) {
//...
}
现在,由于这是一个 ApiController
,所有操作仅使用 Http{Verb}
就足够了
When building a REST API, it's rare that you will want to use
[Route(...)]
on an action method as the action will accept all HTTP methods. It's better to use the more specificHttp*Verb*Attributes
to be precise about what your API supports. Clients of REST APIs are expected to know what paths and HTTP verbs map to specific logical operations.
//GET weatherforecast/Snatch/1
[HttpGet("[action]/{i:int}")]
public IEnumerable<WeatherForecast> Snatch(int i) {
//...
}
这可以通过聚合模板进一步简化
[ApiController]
[Route("[controller]/[action]")] //<-- NOTE THIS
public class WeatherForecastController : ControllerBase {
//...
//GET weatherforecast/get
[HttpGet]
public IEnumerable<WeatherForecast> Get() {
//...
}
//GET weatherforecast/grab
[HttpGet]
public IEnumerable<WeatherForecast> Grab() {
//...
}
//GET weatherforecast/Snatch/1
[HttpGet("{i:int}")]
public IEnumerable<WeatherForecast> Snatch(int i) {
//...
}
}