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



这是我的控制器:

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 -> 返回带 id 的索引 url :/home/Index/1 -> 返回不带 id
的索引

我不明白为什么?

您使用的是混合路由 - 第一个操作使用常规路由,第二个操作使用属性路由。

导航到/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

您不一定需要这两个[Route(...)]属性,但/版本可确保站点的根也与相同的控制器/操作对匹配。

最新更新