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