Asp.Net Core 路由参数始终为 0 或 null

use*_*088 3 asp.net asp.net-mvc routes asp.net-core asp.net-core-2.0

我有一个非常标准的控制器:

这是控制器定义(一些依赖注入,但标准):

public class SeriesController : Controller
{
    private readonly IHostingEnvironment  _env;

    public SeriesController(IHostingEnvironment env)
    {
        _env = env;
    }

    [HttpGet("/series/{id:int?}/{title?}")]
    public IActionResult Index(int id, string title)
    {
        if (id > 0)
        {
            var populateSeriesItem = new PopulateSeriesItem(_env, new SqlConnection());

            var seriesItem = populateSeriesItem.GenerateSeriesItem(id);

    //...
Run Code Online (Sandbox Code Playgroud)

如果id不存在(或0),则显示所有记录;如果为 1 或更大,则显示一条记录。(这就是客户想要的!)

我这样称呼它:

https://localhost/series/3/title

或者

https://localhost/系列/4/

但问题是 id 始终为 0(并且标题为 null)。

如果我将其输入到 URL 栏中或手动指定 id(即 /series?id=3),就会出现这种情况

我只是不明白我错过了什么。

完全相同的设置与不同的控制器完美配合。

    [HttpGet("/books/{id:int?}/{title?}")]
    public ActionResult Index(int id, string title)
    {
        if (id > 0)
        {
            var populateBookItem = new PopulateBookItem(new  SqlConnection(), _env);

            var bookItem = populateBookItem.GenerateBookItem(id);
Run Code Online (Sandbox Code Playgroud)

那个有效。

这是路由配置(只是标准):

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

我一定错过了一些明显的东西,但我很困惑!

任何建议都非常感激。

更新:

我已经剥离了控制器的所有功能。我只是将它传递给一个视图。

这有效:https://localhost:44319/series/14/megacities - 视图报告 id = 14。

这有效:https://localhost:44319/series/5/megacities - 视图报告 id = 5

这有效:https://localhost:44319/series/14/business-with-china - 视图报告 id = 14。

这不起作用:https://localhost:44319/series/5/business-with-china - 它会转到https://localhost:44319/series/0

还有其他 URL 也遵循相同的模式。有些工作,有些不工作。

如果我去掉标题参数,它们似乎都可以工作。

我不知道为什么!

Who*_*ows 5

  1. 删除 routes.MapRoute,Web API 不需要。
  2. HTTPGet 应该看起来像[HttpGet("/books/{id:int?}")]
  3. 请求GET时添加查询参数api/books/5?title=abc
  4. 方法定义:
 [HttpGet("/books/{id:int?}")]
 public ActionResult Index(int id, [FromQuery] string title)
 {
    //code here
 }
Run Code Online (Sandbox Code Playgroud)