这是我的控制者:
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的索引
我不明白为什么?
答案 0 :(得分:1)
您使用的是mixed routing-第一个操作是conventional routing,第二个操作是attribute routing。
当导航到/1
时,您用id
参数执行了第二个操作,因为它已被设置为对/{id}
的路径使用属性路由(通过使用{{1 }}):属性路由覆盖常规路由。
导航到[HttpGet("{id}")]
时,您没有设置/Home/Index/1
参数就执行了第一个动作,这仅仅是因为您拥有的另一个动作已不再匹配,因为该动作已设置为使用属性路由({ {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
版本可确保站点的根也匹配相同的控制器/操作对。