我们有一个不同领域的MVC应用程序。目前只注册了一个区域(在配置中定义),并且在区域注册中没有进行路由注册。当Url.Action方法停止工作时,我遇到了路由问题。我简化的RouteConfig看起来像这样:
routes.MapRoute(
name: "Second",
url: "second/{action}/{id}",
defaults: new { controller = "Second", action = "Action", id = UrlParameter.Optional },
namespaces: new[] { "MvcApplication1.Areas.MyArea.Controllers" }
).DataTokens["area"] = "MyArea";
routes.MapRoute(
name: "Home",
url: "home/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "MvcApplication1.Controllers" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "MvcApplication1.Controllers" }
);
问题是,当我尝试在MyArea中的第二个控制器中的Action.cshtml内调用@Url.Action("Index", "Home")
时,它返回null。当我在Home控制器的Index.cshtml中调用它时,它运行良好。我发现当我在Action.cshtml中使用@Url.Action("Index", "Home", new {Area = ""})
时它也运行良好,但为什么会这样呢?如何避免在没有路由值的情况下只调用@Url.Action("Index", "Home")
?
答案 0 :(得分:1)
这不是问题,但实际上是正确的行为。
使用@ Url.Action()或@ Html.ActionLink时,默认情况下会使用调用它的区域。如果要链接到其他区域(如本例所示),则需要指定参数区域。
在这种特殊情况下,当您尝试链接到根区域时,需要将参数指定为空字符串。 ({Area =“”})