ASP.NET MVC 3 - 区域URL路由问题

时间:2011-02-24 13:31:21

标签: asp.net-mvc

我有一个ASP.Net MVC 3应用程序。有2个区域:

  • 验证 - 处理所有身份验证等
  • 管理 - 物业管理领域

在管理区域,我有一个ManagementController和一个PropertyController。 ManagementController什么都不做,它只有一个简单的Index ActionResult而不是返回一个视图。

PropertyController有一个Index ActionResult,它返回一个包含属性列表的视图,以及一个以propertyId作为参数的Edit ActionResult。在属性索引视图中,我有一个包含属性列表的网格和一个使用以下代码编辑属性的选项:

@Html.ActionLink("Edit", "Edit","Property", new { id = item.PropertyId })

理论上,这应该重定向到我的Property Controller的Edit ActionResult,但是它会重定向到ManagementController的Index ActionResult。我的ManagementAreaRegistration文件如下所示:

context.MapRoute(null, "management", new { controller = "management", action = "Index" });
context.MapRoute(null, "management/properties", new { controller = "Property", action = "Index" });
context.MapRoute(null, "management/properties/Edit/{propertyId}", new { controller = "Property", action = "Edit" });

我的global.asax的RegisterRoutes是这样的:

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

我错过了什么,为什么会重定向到错误的控制器和操作? 在此先感谢!

4 个答案:

答案 0 :(得分:6)

您可能需要在路线值参数中指定区域:

@Html.ActionLink("Edit", "Edit", "Property", new { id = item.PropertyID, area = "Management" }, new { })

根据用于此调用的构造函数,您需要指定最后一个参数htmlAttributes,为了您的目的,该参数将为空。

答案 1 :(得分:3)

在您的路线中,您定义了一个名为propertyId not id:

的参数
context.MapRoute(null, "management/properties/Edit/{propertyId}", new { controller = "Property", action = "Edit" });

试试这个:

@Html.ActionLink("Edit", "Edit","Property", new { propertyId = item.PropertyId })

答案 2 :(得分:1)

我建议使用约束。 例如,我在Global.asax中的默认路由如下:

routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { typeof(MyProject.Controllers.HomeController).Namespace });

然后在我的区域注册:

context.MapRoute(
"Search_default",
"Search/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { typeof(MyProject.Areas.Search.Controllers.HomeController).Namespace }
            );

这意味着我获得了{AppName} /以及{AppName} / Search / Home,这两者都是一种享受。

答案 3 :(得分:0)

从任何区域到家庭做以下

Url.Action("Details", "User", new { @id = entityId, area = "" })

从家到任何地区

Url.Action("Details", "Order", new { @id = entityId, area = "Admin" })