我在使@ Url.Action与具有非标准路由结构的Area一起工作时遇到麻烦。
例如,如果我在“仪表板”区域中注册此路线:
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或secondary id,并且我希望在没有它们的情况下生成url。如果我将它们设置为(int?)null,则仍然无效。
难道我做错了什么?如果我未在routeValues参数中指定URL,则Url.Action(...)是否应返回不含id和secondaryid令牌的URL?
最佳答案
拥有多个可选参数确实会使您的路线变得时髦。基本上,路由引擎无法(出现问题)匹配一个存在或不存在一组可选参数的情况。有关更多信息,请查看此blog post on the same issue。
由于您并不总是需要id或secondary 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或不发送ID时,最后一条路由是您的默认路由。我相信此顺序也能正常工作,请记住,鉴于路由是按顺序处理的,您希望您的路由从最具体到最不具体。
关于c# - Url.Action不适用于非标准MVC路由,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13649726/