我已将以下路由添加到我的global.asax文件中: -
routes.MapRoute(
"Admin_Route",
"Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new[] { "PriceCompare.Admin.Controllers" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new[] { "PriceCompare.Controllers" }
);
管理控制器,即 ManageCatsController,ManageBrandsController等驻留在 PriceCompare.Admin.Controllers 命名空间中,其他常规控制器位于 PriceCompare.Controllers 命名空间。
问题是,我可以通过在他们面前添加 Admin / 来访问所有控制器,无论他们是否在 PriceCompare.Admin .Controllers 命名空间。
此外,我可以直接访问管理控制器而无需为 Admin / 添加前缀。
为什么会这样。我误解了路由行为。
答案 0 :(得分:1)
您需要注册管理区域。
当我为区域注册路线时,我总是这样做:
在App / Areas / Admin文件夹中创建一个包含此内容的AdminAreaRegistration.cs文件...
using System.Web.Mvc;
namespace AppName.Areas.Admin
{
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin",
"Admin/{controller}/{action}/{id}",
new { controller="Home", action = "Index", id = UrlParameter.Optional },
new string[] { "AppName.Areas.Admin.Controllers" }
);
}
}
}
现在在Global.asax
中执行此操作:
protected void Application_Start()
{
// Add this next line
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
// Add any other stuff (like IoC or whatever)
}
仅在RegisterRoutes
Global.asax
中注册您的正常路线,如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
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
new string[] { "AppName.Controllers" }
);
}
我还建议将Area
部分保留在您的管理员命名空间内(因此在您的情况下将其称为PriceCompare.Areas.Admin.Controller
),因为这样可以让以后的生活变得更轻松。
请尝试这个并让我知道它是否有效: - )