Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC:独立的管理控制器_Asp.net Mvc_Routing_Controller - Fatal编程技术网

Asp.net mvc MVC:独立的管理控制器

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()) {

我想知道是否有选择做以下事情

如果我打电话 “管理员/类别”-调用“CategoryAdminController” 如果我打电话 “类别”-调用“类别控制器”

这是非常容易做到这一点,通过路由和自定义控制器工厂。以下是解决方案:

// 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”,无需将新路由添加到每个案例的路由集合中。