.net Core - 使用Route属性时未加载默认控制器

时间:2016-10-05 13:56:03

标签: asp.net-mvc asp.net-mvc-routing asp.net-core-mvc .net-core

新的.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属性。然后默认路由可以解决任何问题。

这是预期的行为吗? 这种行为背后的原因是什么?

1 个答案:

答案 0 :(得分:17)

来自asp docs

  

操作可以是常规路由或属性路由。配售   控制器上的路由或操作使其属性路由。   无法通过以下方式访问定义属性路由的操作   传统路线,反之亦然。上的任何路由属性   controller使控制器属性中的所有操作都被路由。

所以基本上如果你使用属性,那么UseMvcUseMvcWithDefaultRoute中定义的路由将被忽略。在这种情况下,只会使用该属性。

如果您希望获得与具有可选段的默认路由类似的效果,您仍然可以使用多个路由属性。再次来自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");
   }
}