我有这些路线定义:
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。
对此有任何建议吗?
答案 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