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
部分),它将正常工作。
如果您需要的路由正是这样,那么属性路由是您的最佳选择。但是,您提到的尝试都缺少某些东西。您的控制器应同时装饰有 RouteArea
和 RoutePrefix
以组成路径的第一部分:
[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();
我目前正在尝试生成此 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
部分),它将正常工作。
如果您需要的路由正是这样,那么属性路由是您的最佳选择。但是,您提到的尝试都缺少某些东西。您的控制器应同时装饰有 RouteArea
和 RoutePrefix
以组成路径的第一部分:
[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();