Asp.net mvc MVC:独立的管理控制器
我想知道是否有选择做以下事情 如果我打电话 “管理员/类别”-调用“CategoryAdminController” 如果我打电话 “类别”-调用“类别控制器” 这是非常容易做到这一点,通过路由和自定义控制器工厂。以下是解决方案:Asp.net mvc MVC:独立的管理控制器,asp.net-mvc,routing,controller,Asp.net Mvc,Routing,Controller,我想知道是否有选择做以下事情 如果我打电话 “管理员/类别”-调用“CategoryAdminController” 如果我打电话 “类别”-调用“类别控制器” 这是非常容易做到这一点,通过路由和自定义控制器工厂。以下是解决方案: // add route routes.Add(new Route("{culture}/admin/{controller}/{action}/{*id}", new MvcRouteHandler()) {
// add route
routes.Add(new Route("{culture}/admin/{controller}/{action}/{*id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = "", culture = LocalizationManager.DefaultCulture.Name, controllerSufix = "Admin" }),
Constraints = new RouteValueDictionary(new { culture = new CultureRouteConstraint() })
});
然后创建自定义控制器工厂
public class CmsControllerFactory : DefaultControllerFactory
{
RequestContext _requestContext;
protected override Type GetControllerType(string controllerName)
{
if (_requestContext.RouteData.Values.ContainsKey("controllerSufix"))
{
string sufix = (string)_requestContext.RouteData.Values["controllerSufix"];
Type type = base.GetControllerType(String.Concat(controllerName, sufix));
if (type != null)
return type;
}
return base.GetControllerType(controllerName);
}
public override IController CreateController(RequestContext requestContext, string controllerName)
{
_requestContext = requestContext;
return base.CreateController(requestContext, controllerName);
}
}
我希望任何人都知道一些不同的/更好的解决方案。您只需使用两个路由处理程序即可做到这一点:
routes.MapRoute(
"Admin",
"/admin/category/{id}",
new { controller = "CategoryAdminController", action = "Index", id = "" }
);
然后:
routes.MapRoute(
"Standard",
"/category/{id}",
new { controller = "CategoryController", action = "Index", id = "" }
);
刚刚注意到,在这种情况下,即使我在Category>Index视图中调用“localhost/Category”操作链接,比如将在其中插入“admin”部分,所以我仍然在搜索解决方案。是的,这也是一个解决方案,但我说的是一些约定,您可以只调用“admin/Category”来调用CategoryAdminController,或者只调用“Category”“CategoryController”,无需将新路由添加到每个案例的路由集合中。