【问题标题】:MVC : Separate admin controllersMVC:独立的管理控制器
【发布时间】:2010-12-17 19:14:56
【问题描述】:

如果可以选择执行以下操作,我正在徘徊

如果我打电话 “admin/Category” - 调用“CategoryAdminController” 如果我打电话 “Category” - 调用“CategoryController”

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

// 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);

}
}

如果有人知道一些不同/更好的解决方案,我想知道。

【问题讨论】:

  • 刚刚注意到,在这种情况下,即使我在 Category > Index 视图中调用“localhost/Category”操作链接,例如 也会插入“管理员”部分,所以我仍在寻找解决方案。

标签: asp.net-mvc routing controller


【解决方案1】:

您可以使用两个路由处理程序非常简单地做到这一点:

routes.MapRoute(
   "Admin",                                              
   "/admin/category/{id}",                           
   new { controller = "CategoryAdminController", action = "Index", id = "" }
);

然后:

routes.MapRoute(
   "Standard",                                              
   "/category/{id}",                           
   new { controller = "CategoryController", action = "Index", id = "" }
 );

【讨论】:

  • 是的,这也是一个解决方案,但我说的是约定,您可以只调用“admin/category”来调用 CategoryAdminController,或者只调用“Category”来调用“CategoryController”而不向 Route 添加新路由每个案例的集合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多