在属性路由时,Url.Action会生成错误的URL

时间:2017-05-09 01:27:43

标签: c# asp.net-mvc-5 asp.net-mvc-routing

很多类似的问题,但没有一个像这个问题: 我在MVC5项目上使用属性路由。 在尝试定义这样的简单路线时:

    [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 }
        );
    }
}

(VisualStudio2017上MVC5模板的默认设置) 所以,我猜,属性路由优先于基于约定的路由。

1 个答案:

答案 0 :(得分: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 }
        );
    }
}