2017-05-09 52 views
0

很多类似的问题,但没有一个非常喜欢这个问题: 我在MVC5项目中使用属性路由。 当试图定义这样一个简单的途径:Url.Action在属性路由时生成错误的URL

[HttpGet] 
    [Route("Empresa/Filial/{id:int}/Editar")] 
    public ActionResult UpdateFilial(int id) 
    { 
     ... 
    } 

,并生成一个URL上来看,是这样的:

<a href="@Url.Action("UpdateFilial", "Empresa", new { id = filial.IDFilial })" title="@Lang.M("TitleEditar_Filial")" class="btn btn-xs btn-default">EDIT</a> 

我最终是这样的:

http://localhost:59936/Empresa/Filial/Editar?id=1 

结果为404,因为它应该是:

"http://localhost:59936/Empresa/Filial/1/Editar" 

我在这做错了什么?

编辑:

我RouteConfig看起来是这样的:

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

     //Acionando rotas por atributos (annotations) 
     routes.MapMvcAttributeRoutes(); 

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

(上MVC5模板默认的VisualStudio2017) 所以,我想,属性路由拥有基于约定的路线的优先级。

+0

之前是否启用属性以公约为基础的路线前routeconfig.cs路由? – Nkosi

+0

有很多不同的事情可能发生,但是您没有提供足够的信息来确定问题。 1)名为'EmpresaController'的控制器中的'UpdateFilial'方法? 2)是否有'UpdateFilial'的重载? 3)“filial.IDFilial”的值是int吗?有一点是确定的 - 对Url.Action的调用与您提供的路由不匹配。不,AttributeRouting不优先于基于会议的路由 - 路由按照它们注册的顺序来考虑。期。 – NightOwl888

回答

0

确保该属性路由已启用RouteConfig基于约定的路由

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

     //enable attribute routing 
     routes.MapMvcAttributeRoutes(); 

     //convention-based routes 

     //...other routes 

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

看起来它已经是这样了。棘手的事情... –