带有 id 的默认路由在 asp.net 核心中不起作用

default route with id does not working in asp.net core

这是我的控制器:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        var route = Request.Path.Value;
        return View("index" as object);
    }

    [HttpGet("{id}")]
    public IActionResult Index(int id)
    {
        return View("index id" as object);
    }
}

这是我的路线:

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

url : /1 -> return id 为
的索引 url : /Home/Index/1 -> return 没有 id 的索引

我不明白为什么?

您第二次使用 mixed routing - you've got conventional routing for the first action and attribute routing

当您导航到 /1 时,您使用 id 参数点击了第二个操作,因为它已被设置为对 /{id} 的路径使用属性路由(通过使用 [HttpGet("{id}")]): 属性路由覆盖常规路由。

当您导航到 /Home/Index/1 时,您在没有 id 参数的情况下执行了第一个操作,这仅仅是因为您的另一个操作不再匹配,因为它已设置为使用属性路由(/{id}),所以它根本不再匹配 /Home/Index/1。使用来自 UseMvc 的常规路由模板,您已经说过 id 是可选的,因此匹配仍然有效。

为了达到您的要求,您可以专门为此控制器使用属性路由。这是它的样子:

[Route("/")]
[Route("[controller]/[action]")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        ...
    }

    [HttpGet("{id}")]
    public IActionResult Index(int id)
    {
        ...
    }
}

这里添加两个[Route(...)]属性增加了对以下两个路由的支持:

  1. //{id}.
  2. /Home/Index/Home/Index/{id}.

[controller][action] 是分别代表控制器和动作名称的占位符 - 如果您需要,您也可以只使用文字值 HomeIndex更喜欢更固定的东西。

您不一定需要 both [Route(...)] 属性,但 / 版本确保站点的根也匹配相同的 controller/action对.