这是我的控制器:
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(...)]
属性可添加对以下两个路由的支持:
/
和/{id}
./Home/Index
和/Home/Index/{id}
.
[controller]
和[action]
是分别表示控制器和操作名称的占位符 - 如果您更喜欢更固定的内容,也可以只使用文本值Home
和Index
。
您不一定需要这两个[Route(...)]
属性,但/
版本可确保站点的根也与相同的控制器/操作对匹配。