Orchard Admin 路由调用错误的 MVC 控制器
Orchard Admin route calls wrong MVC controller
我正在创建一个提供以下路线的 Orchard 模块
public System.Collections.Generic.IEnumerable<Orchard.Mvc.Routes.RouteDescriptor> GetRoutes()
{
Orchard.Mvc.Routes.RouteDescriptor[] lRoutes =
new Orchard.Mvc.Routes.RouteDescriptor[]
{
new Orchard.Mvc.Routes.RouteDescriptor()
{
Name = "Admin URL",
Priority = 0,
Route = new System.Web.Routing.Route(
"RetailSector/Mailing/Admin",
new System.Web.Routing.RouteValueDictionary() { {"area", "MyModuleName"}, {"controller", "Admin"}, {"action", "Index"} },
new System.Web.Routing.RouteValueDictionary(),
new System.Web.Routing.RouteValueDictionary() { {"area", "MyModuleName"} },
new System.Web.Mvc.MvcRouteHandler()
)
}
};
return lRoutes;
}
当我输入
http://localhost:30321/OrchardLocal/RetailSector/TuesdayMail/Admin
在浏览器中,Orchard 路由到 Orchard Admin(仪表板)而不是显示我的管理视图。我尝试了不同的优先级,不起作用。然后我尝试将控制器名称从 Admin 更改为 Administration,然后它突然起作用了。
有没有办法让路由与单词 "Admin" 一起工作?
更新:
AdminController.Index()
方法中的断点被击中,因此我的 AdminController
被路由系统正确使用,但在 return View()
之后显示了 Orchard 仪表板?!?添加像 return View("Test")
这样的视图参数应该导致显示 Views\Admin\Test.cshtml
也不起作用。我想我正面临一个 Orchard 调试会话。
Orchard 会自动将任何名为 AdminController
的控制器解析为以 Admin 主题(仪表板)为主题。它的作用与将 [Admin]
属性应用于控制器相同。
查看第 40-55 行 Orchard.Framework.UI.Admin.AdminFilter.cs 的代码:
private static bool IsAdmin(AuthorizationContext filterContext) {
if (IsNameAdmin(filterContext) || IsNameAdminProxy(filterContext)) {
return true;
}
var adminAttributes = GetAdminAttributes(filterContext.ActionDescriptor);
if (adminAttributes != null && adminAttributes.Any()) {
return true;
}
return false;
}
private static bool IsNameAdmin(AuthorizationContext filterContext) {
return string.Equals(filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, "Admin",
StringComparison.OrdinalIgnoreCase);
}
它通过检查控制器的名称是否为 Admin 来检查当前上下文是否为 admin。
您可能希望与 Orchard 处理此过滤的方式保持一致。因此,如果您不想应用管理主题,我建议您重命名您的控制器。
我正在创建一个提供以下路线的 Orchard 模块
public System.Collections.Generic.IEnumerable<Orchard.Mvc.Routes.RouteDescriptor> GetRoutes()
{
Orchard.Mvc.Routes.RouteDescriptor[] lRoutes =
new Orchard.Mvc.Routes.RouteDescriptor[]
{
new Orchard.Mvc.Routes.RouteDescriptor()
{
Name = "Admin URL",
Priority = 0,
Route = new System.Web.Routing.Route(
"RetailSector/Mailing/Admin",
new System.Web.Routing.RouteValueDictionary() { {"area", "MyModuleName"}, {"controller", "Admin"}, {"action", "Index"} },
new System.Web.Routing.RouteValueDictionary(),
new System.Web.Routing.RouteValueDictionary() { {"area", "MyModuleName"} },
new System.Web.Mvc.MvcRouteHandler()
)
}
};
return lRoutes;
}
当我输入
http://localhost:30321/OrchardLocal/RetailSector/TuesdayMail/Admin
在浏览器中,Orchard 路由到 Orchard Admin(仪表板)而不是显示我的管理视图。我尝试了不同的优先级,不起作用。然后我尝试将控制器名称从 Admin 更改为 Administration,然后它突然起作用了。
有没有办法让路由与单词 "Admin" 一起工作?
更新:
AdminController.Index()
方法中的断点被击中,因此我的 AdminController
被路由系统正确使用,但在 return View()
之后显示了 Orchard 仪表板?!?添加像 return View("Test")
这样的视图参数应该导致显示 Views\Admin\Test.cshtml
也不起作用。我想我正面临一个 Orchard 调试会话。
Orchard 会自动将任何名为 AdminController
的控制器解析为以 Admin 主题(仪表板)为主题。它的作用与将 [Admin]
属性应用于控制器相同。
查看第 40-55 行 Orchard.Framework.UI.Admin.AdminFilter.cs 的代码:
private static bool IsAdmin(AuthorizationContext filterContext) {
if (IsNameAdmin(filterContext) || IsNameAdminProxy(filterContext)) {
return true;
}
var adminAttributes = GetAdminAttributes(filterContext.ActionDescriptor);
if (adminAttributes != null && adminAttributes.Any()) {
return true;
}
return false;
}
private static bool IsNameAdmin(AuthorizationContext filterContext) {
return string.Equals(filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, "Admin",
StringComparison.OrdinalIgnoreCase);
}
它通过检查控制器的名称是否为 Admin 来检查当前上下文是否为 admin。
您可能希望与 Orchard 处理此过滤的方式保持一致。因此,如果您不想应用管理主题,我建议您重命名您的控制器。