为什么我的命名路线不起作用?

时间:2015-03-17 21:46:38

标签: asp.net-mvc asp.net-mvc-5 url-routing asp.net-mvc-routing attributerouting

标准MVC 5模板。
所以我试图理解并创建一个命名路由,如:

<a href="@Url.RouteUrl(routeName: "myroute",  routeValues: new { code = "123" })">this link</a>

在家庭控制器中:

[Route("Home/DoIt", Name = "myroute"), HttpGet]
public ActionResult DoIt(string code)
{
  return View();
}

当然在RoutConfig.cs中启用了MvcAttributeRouting:

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  routes.MapRoute(
      name: "Default",
      url: "{controller}/{action}/{id}",
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  );
  routes.MapMvcAttributeRoutes();
}

因为如果没有启用,会得到:

  

在路径集合中找不到名为“myroute”的路线。   参数名称:名称

但我得到了:

  

无法找到资源。描述:HTTP 404.资源你   正在寻找(或其中一个依赖)可能已被删除,   更改名称,或暂时不可用。请查阅   以下网址,并确保拼写正确。

     

请求的网址:/ Home / DoIt

我做错了什么?

编辑:显然,我在使用Route属性做错了,因为即使这样也行不通:

  [Route("DoIt")]

[Route("Home/DoIt")]

无论请求网址是http://localhost/Home/DoIt还是http://localhost/DoIt

,两者都会给我404

2 个答案:

答案 0 :(得分:4)

放置MapMvcAttributeRoutes行的 订单 非常重要。你把它放在错误的位置。必须在默认路由之前调用它。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Add this to get attribute routes to work
        routes.MapMvcAttributeRoutes();

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

路由的工作方式类似于switch case语句。 第一个匹配获胜。但是如果你首先放置默认路由,它将匹配每个具有0,1,2或3段的URL,并有效地覆盖那些长度的任何属性路由。

参考:http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx#enabling-attribute-routing

答案 1 :(得分:0)

您是否尝试过直接从浏览器访问操作?我的意思是YourHost / Home / DoIt。如果它也引发404错误,那么您的问题可能来自您的路由配置。

可能您没有启用路由属性配置。检查以下内容: 来自MSDN:

  

要启用属性路由,请在调用期间调用MapMvcAttributeRoutes   配置。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes();
    }
}