[英]Url.Action doesnt work with non standard MVC Route
我在使 @Url.Action 与具有非标准路由结构的区域一起工作时遇到问题。
例如,如果我在我的仪表板区域注册这条路线:
context.MapRoute(
"Dashboard_default",
"Dashboard/{controller}/{action}/{id}",
new { controller = "View", action = "Display", id = UrlParameter.Optional }
);
然后在我的布局视图中我调用:
@Url.Action("Select", "View", new { area = "Dashboard" })
我得到一个正确的网址:/Dashboard/View/Select
但是,如果我更改路由以包含这样的可选辅助 ID:
context.MapRoute(
"Dashboard_default",
"Dashboard/{controller}/{action}/{id}/{secondaryid}",
new { controller = "View", action = "Display", id = UrlParameter.Optional, secondaryid = UrlParameter.Optional }
);
然后对 @Url.Action(...) 的相同调用不会返回任何 url。 如果我使用真实值指定这些可选参数,如下所示:
@Url.Action("Select", "View", new { area = "Dashboard", id = 1, secondaryid = 2 })
我确实得到了一个上帝的返回值:/Dashboard/View/Select/1/2
问题是我在这方面的一些操作不需要 id 或辅助 id,我希望在没有它们的情况下生成 url。 如果我将它们设置为 (int?)null 它仍然不起作用。
难道我做错了什么? 如果我没有在 routeValues 参数中指定它们,Url.Action(...) 不应该返回没有 id 和 secondaryid 标记的 URL 吗?
有多个可选参数对你的路由来说很时髦。 基本上,路由引擎不能(有问题)匹配一个或没有可选参数,如果有一组可选参数。 有关更多信息,请查看关于同一问题的这篇博文。
由于您并不总是需要 id 或辅助 id,只需创建几条路线来处理这些情况。
context.MapRoute(
"Dashboard_IdAndSecondaryId",
"Dashboard/{controller}/{action}/{id}/{secondaryid}",
new { controller = "View", action = "Display"}
);
context.MapRoute(
"Dashboard_default_WithSecondaryId",
"Dashboard/{controller}/{action}/{secondaryid}",
new { controller = "View", action = "Display"}
);
context.MapRoute(
"Dashboard_default",
"Dashboard/{controller}/{action}/{id}/",
new { controller = "View", action = "Display", id = UrlParameter.Optional}
);
现在,当您只发送一个 Id、一个 secondaryId 或两者都发送时,您将拥有匹配的路由。 我们可以删除前两个路由中的可选参数声明,因为为了匹配该路由,您必须发送所需的参数。 在不发送所需参数的情况下,您只需要匹配最后一条路由。
当操作链接中仅发送 Id 或 none 时,最后一条路由是您的默认路由。 我相信这个顺序也有效,记住你希望你的路线从最具体到最不具体,因为它们是按顺序处理的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.