【问题标题】:This custom route does not work in MVC5此自定义路由在 MVC5 中不起作用
【发布时间】:2018-02-01 10:52:54
【问题描述】:

我有这些路线定义:

        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。

请问有什么建议吗?

【问题讨论】:

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


【解决方案1】:

请在下面的路由配置中尝试

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

【讨论】:

  • 没有成功...参数是用“?”传递的。
  • 我尝试过属性路由,添加属性并调用 routes.MapMvcAttributeRoutes();在注册路线时。在这种情况下,Asistencia/Mensajeria/Componer 和 Asistencia/Mensajeria/Componer/Inbox 都会显示 404
【解决方案2】:

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

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

【讨论】:

  • @jstuardo 很高兴听到!如果您发现答案有帮助,请不要忘记投票或将其推销为已接受。祝你编码好运!
  • 误报,对不起..此方法生成正确的URL但实际上并没有传递参数。
  • 所以你得到了/Asistencia/Mensajeria/Componer/Inbox,但操作没有收到origen参数?
  • 对...但我找到了解决方案。我会尽快发布的
【解决方案3】:

经过多次尝试和错误,我找到了解决方案。

事实上,由于这个控制器属于一个区域,所以路由应该在 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 移到那里作为逻辑推论。

我更喜欢这样添加路由而不是属性路由,因为这样我把所有的路由放在一起,所以以后维护起来更容易。

问候

詹姆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2014-12-27
    • 2016-01-06
    • 2016-05-10
    • 1970-01-01
    • 2019-12-10
    • 2016-01-08
    相关资源
    最近更新 更多