2017-09-14 136 views
1

如果我申请[Route(Name =“WhatEver”)]作为默认站点路由,我在访问站点根时得到HTTP 404。RouteAttribute破坏了我的默认路由

例如:

  • 创建新的样本MVC项目。
  • 属性添加路由:

    // file: App_Start/RouteConfig.cs 
    public class RouteConfig 
    { 
        public static void RegisterRoutes(RouteCollection routes) 
        { 
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
         routes.MapMvcAttributeRoutes(); // Add this line 
         routes.MapRoute(
          name: "Default", 
          url: "{controller}/{action}/{id}", 
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
         ); 
        } 
    } 
    
  • 现在添加路由属性

    [RoutePrefix("Zome")] 
    public class HomeController : Controller 
    { 
        [Route(Name = "Zndex")] 
        public ActionResult Index() 
        { 
         return View(); 
        } 
        ... 
    } 
    

而且,当您启动了调试运行项目,你将有HTTP错误404。我应该如何使用默认路由映射的属性路由?

+0

什么是后面使用'〔路线(名称= “Zndex”)]为'Index'动作'属性的目的是什么? '[domain]/Zome'会自动引用'[domain]/Zome/Index',使用'RouteAttribute'可能需要'[domain]/Zome/Zndex'到达'Index'操作。 –

+0

我认为路由名不用于路由匹配,所以''[domain]/Zome/Zndex'指向任何地方。我需要在Index动作上使用路由名称,因为我想使用Url助手,路由名称如下所示:'Zndex page' –

回答

1

对于使用具有路由前缀的属性路由的默认路由,您需要将路由模板设置为空字符串。如果控制器已经有路由前缀,您也可以使用~/覆盖站点根目录。

[RoutePrefix("Zome")] 
public class HomeController : Controller { 
    [HttpGet] 
    [Route("", Name = "Zndex")]  //Matches GET /Zome 
    [Route("Zndex")]     //Matches GET /Zome/Zndex 
    [Route("~/", Name = "default")] //Matches GET/<-- site root 
    public ActionResult Index() { 
     return View(); 
    } 
    //... 
} 

也就是说,在控制器上使用属性路由时,它不再匹配基于约定的路由。该控制器可以是所有基于属性的或者所有基于约定的不混合的。

Attribute Routing in ASP.NET MVC 5参考

+0

可否请您指出任何实际上说过的文档,我只能使用属性路由或常规路由在我的控制器上,但不是两个。你引用链接实际上说(3次),我可以在同一个项目中使用它们(但不在同一个控制器上?)thx无论如何 –

+0

@ vasily.sib它与路由注册的顺序有关。因为在基于约定的路由之前检查属性路由,只要控制器使用路由属性,它将永远达不到基于约定的路由。即使没有匹配属性路由。你会得到未找到的404错误。 – Nkosi

+0

明白了。将'[Route(“〜/”,Name =“Zefault”)]'属性添加到索引操作就可以实现。但是,我实际上**可以**在同一个控制器中混合“属性路由”和“约定路由”,但是在同一个动作中不能**。在我的示例应用程序中,我可以访问'/ Home/About'动作,但'/ Home/Index'将返回404.这是否记录在互联网的任何地方?非常感谢先生。 @nkosi指出我的解决方案。 –

0

当您启动您的网站时,在App_Start文件夹的route.config文件中设置了一个默认路由。它看起来是这样的:

 routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

如果你不再有你的家控制器中的“指数”行动站点试图白白给散热鳍片,作为主页,将返回404,您可以更新您的路线.config文件来引用新的主页。