新的.net核心Web应用程序项目带有以下路由配置:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
如果将其替换为app.UseMvc()
并为HomeController及其操作(索引,关于,联系人,错误)添加适当的Route
属性,它仍然有效。由于我们没有指定默认路由,因此如果您点击http://localhost:25137/,则不会呈现默认视图(Home / Index)。希望理解是正确的!
现在,由于我需要在http://localhost:25137/被点击时显示默认视图,因此我将路由代码更改为app.UseMvcWithDefaultRoute();
,根据定义,它将等效于初始代码段。即使这样,它也没有呈现默认视图;但在使用完整的URL(http://localhost:25137/home/index)时工作。这意味着路由仍然有效但不是默认路由!
然后我回到控制器并从HomeController及其操作中删除了所有Route
属性。然后默认路由可以解决任何问题。
这是预期的行为吗? 这种行为背后的原因是什么?
答案 0 :(得分:17)
来自asp docs:
操作可以是常规路由或属性路由。配售 控制器上的路由或操作使其属性路由。 无法通过以下方式访问定义属性路由的操作 传统路线,反之亦然。上的任何路由属性 controller使控制器属性中的所有操作都被路由。
所以基本上如果你使用属性,那么UseMvc
或UseMvcWithDefaultRoute
中定义的路由将被忽略。在这种情况下,只会使用该属性。
如果您希望获得与具有可选段的默认路由类似的效果,您仍然可以使用多个路由属性。再次来自asp docs中的同一篇文章:
public class MyDemoController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
public IActionResult MyIndex()
{
return View("Index");
}
[Route("Home/About")]
public IActionResult MyAbout()
{
return View("About");
}
[Route("Home/Contact")]
public IActionResult MyContact()
{
return View("Contact");
}
}