Asp.Net MVC 5自定义action路由下一个区域

Asp.Net MVC 5 custom action routing under an area

我目前正在尝试生成此 url“/Cloud/Hosting/RoaringPenguin/Manage/Exclusions”。

这里是地区报名

public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Hosting_default",
            "Cloud/Hosting/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }

这里是控制器

    public class RoaringPenguinController : PortalControllerBase
{


    public ActionResult Exclusions()
    {
        return View("Exclusions");
    }


}

我试过像这样在动作本身上添加一条路线

[Route("Manage/Exclusions")]
public ActionResult Exclusions()

我也试过给控制器本身添加一些属性

[RouteArea("Hosting")]
[RoutePrefix("RoaringPenguin")]
public class RoaringPenguinController : PortalControllerBase

但这似乎也不起作用。如果我关闭所有属性,那么我得到的最终 url 是“/Cloud/Hosting/RoaringPenguin/Exclusions”。 有谁知道我怎样才能在 url 中也得到 "Manage"?

只是为了确认我在 RouteConfig class

下的 RegisterRoutes 方法中设置了以下内容
routes.MapMvcAttributeRoutes();

感谢任何帮助。谢谢

您的默认区域路由不允许最后的 "Manage/Exclusions" 部分。如果您将 URL 设为 /Cloud/Hosting/RoaringPenguin/Exclusions(减去路径的 Manage 部分),它将正常工作。

如果您需要的路由正是这样,那么属性路由是您的最佳选择。但是,您提到的尝试都缺少某些东西。您的控制器应同时装饰有 RouteAreaRoutePrefix 以组成路径的第一部分:

[RouteArea("Hosting", AreaPrefix = "Cloud/Hosting")]
[RoutePrefix("RoaringPenguin")]
public class RoaringPenguinController : Controller

但是,在处理区域时通常会实际实现一个基本控制器,这样您就可以在一个地方指定 RouteArea

[RouteArea("Hosting", AreaPrefix = "Cloud/Hosting")]
public class HostingBaseController : Controller

[RoutePrefix("RoaringPenguin")]
public class RoaringPenguinController : HostingBaseController

那么,在你的行动中:

[Route("Manage/Exclusions")]
public ActionResult Exclusions()

和你一样。

尝试使用此代码

[RouteArea("AreaName", AreaPrefix = "Cloud/Hosting")]
[RoutePrefix("RoaringPenguin")]
public class SampleController : Controller
{
     [Route("Manage/Exclusions")]
     public ActionResult Exclusions()
    {
         return View("Exclusions");
    }
}

[RoutePrefix("Cloud/Hosting/RoaringPenguin")]
public class RoaringPenguinController : PortalControllerBase
{

    [Route("Manage/Exclusions")]
    public ActionResult Exclusions()
   {
       return View("Exclusions");
    }

}

这将是第一行

  routes.MapMvcAttributeRoutes();

之后只需要写这行

 AreaRegistration.RegistrationAllAreas();