MVC5 Url.Action在区域

时间:2016-03-30 08:02:42

标签: c# asp.net-mvc

我们有一个不同领域的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")

1 个答案:

答案 0 :(得分:1)

这不是问题,但实际上是正确的行为。

使用@ Url.Action()或@ Html.ActionLink时,默认情况下会使用调用它的区域。如果要链接到其他区域(如本例所示),则需要指定参数区域。

在这种特殊情况下,当您尝试链接到根区域时,需要将参数指定为空字符串。 ({Area =“”})