开发者

ASP.NET MVC 3 - Area URL Routing Problem

I have an ASP.Net MVC 3 application. With 2 Areas:

  • Auth - handles all the authentication etc
  • Management - area for property management

In the Management Area I have a ManagementController and a PropertyController. The ManagementController does nothing, it only has a simple Index ActionResult than return a view.

The PropertyController has an Index ActionResult that returns a view with a list of properties as well as an Edit ActionResult that takes a propertyId as parameter. In the Property Index view i have a grid with the list of properties and an option to edit the property with the following code:

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

In theory this should redirect to the Edit ActionResult of my Property Controller,however it redirects to the Index ActionResult of my ManagementController. My ManagementAreaRegistration file looks like this:

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" });

And my global.asax's RegisterRoutes like this:

            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
        );

What am I missing, why would it redirect to the wrong controller and action? Thanks in Advance!


You might need to specify the area in your route values parameter:

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

Based on the constructor used for this call, you need to specify the last parameter, htmlAttributes, which, for your purposes, would be empty.


In your route you defined a parameter called propertyId not id:

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

Try this:

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


I'd suggest using constraints. For example my default route in the Global.asax is as follows:

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

Then in my area registration:

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 }
            );

This means I get {AppName}/ as well as {AppName}/Search/Home and both work a treat.


From any Area to Home do following

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

From Home to any Area

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜