此自定义路由在MVC5中不起作用

时间:2017-08-23 18:08:06

标签: asp.net-mvc asp.net-mvc-5 routes

我有这些路线定义:

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

            routes.MapRoute(
                name: "InboxToCompose",
                url: "Asistencia/Mensajeria/Componer/{origen}",
                defaults: new { controller = "Mensajeria", action = "Componer", area = "Asistencia" }
            );

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

路由“InboxToCompose”应映射到此方法:

    // GET: /Asistencia/Mensajeria/Componer/origen
    public ActionResult Componer(string origen)
    {

    }

此方法位于“Asistencia”区域的“Mensajeria”控制器中。

当我在视野中调用它时:

Url.Action("Componer", "Mensajeria", new { area = "Asistencia", origen = "Inbox" })

生成的网址

/Asistencia/Mensajeria/Componer?origen=Inbox

这样,我可以看到调用方法时“origen”参数填充了值“Inbox”。

但是,我希望它只是

/Asistencia/Mensajeria/Componer/Inbox

如果我在浏览器中使用该URL,则调用该方法,但“origen”参数等于null。

对此有任何建议吗?

3 个答案:

答案 0 :(得分:0)

请在路线配置中尝试以下

routes.MapRoute(
            name: "InboxToCompose",
            url: "Asistencia/Mensajeria/Componer/{origen}",
            defaults: new { controller = "Mensajeria", action = "Componer", area = "Asistencia" , origen = ""}
        );

答案 1 :(得分:0)

你试过Url.RouteUrl吗?您可以传递RegisterRoutes中定义的自定义路由的名称,而不是传递操作和控制器。用此替换Url.Action行,

Url.RouteUrl("InboxToCompose", new { area = "Asistencia", origen = "Inbox" })

答案 2 :(得分:0)

经过大量尝试和错误后,我找到了解决方案。

事实是,由于此控制器属于某个区域,因此应在AreaRegistration派生类中定义该路径。

我发现这个类包含这个:

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        "Asistencia_default",
        "Asistencia/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}

所以我将自定义MapRoute从RouteConfig移动到AsistenciaAreaRegistration类。这样就有用了。使用Url.Action生成的URL和参数都是正确接收的。

在阅读本页后我意识到了这一点:https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/

该页面讲述了属性路由,所以我尝试在我的操作中添加一个属性,但是当我调用AreaRegistration.RegisterAllAreas();时,抛出了一个运行时异常,告诉该区域已在AsistenciaAreaRegistration类中定义

所以我决定将MapRoute作为逻辑演绎移动到那里。

我更喜欢以这种方式添加路由而不是属性路由,因为通过这种方式,我将所有路由放在一起,因此将来更容易维护。

此致

的Jaime