【问题标题】:change controller name convention in ASP.NET MVC在 ASP.NET MVC 中更改控制器名称约定
【发布时间】:2011-03-01 23:42:46
【问题描述】:

有没有办法更改 ASP.NET MVC 中控制器的命名约定?

我想要将我的控制器命名为 InicioControlador 而不是 InicioController,或者更好的是,使用前缀而不是后缀,并将 ControladorInicio 作为我的控制器名称。

从我目前阅读的内容来看,我认为我必须实现自己的控制器工厂。如果你们能指出正确的方向,我将不胜感激。

【问题讨论】:

    标签: asp.net-mvc controller prefix


    【解决方案1】:

    我决定深入挖掘,并在搜索 MVC 源代码后找到了我正在寻找的东西。控制器名称的约定深深植根于 MVC 框架的根部,特别是在 ControllerDescriptor 和 ControllerTypeCache 两个类中。

    在ControllerDescriptor 中,它由以下属性给出:

    public virtual string ControllerName {
      get {
        string typeName = ControllerType.Name;
        if (typeName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) {
          return typeName.Substring(0, typeName.Length - "Controller".Length);
        }
        return typeName;
      }
    }
    

    在ControllerTypeCache中通过以下方法给出:

    internal static bool IsControllerType(Type t) {
      return
        t != null &&
        t.IsPublic &&
        t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase) &&
        !t.IsAbstract &&
        typeof(IController).IsAssignableFrom(t);
    }
    
    public void EnsureInitialized(IBuildManager buildManager)
    {
      if (_cache == null)
      {
        lock (_lockObj)
        {
          if (_cache == null)
          {
            List<Type> controllerTypes = TypeCacheUtil.GetFilteredTypesFromAssemblies(_typeCacheName, IsControllerType, buildManager);
            var groupedByName = controllerTypes.GroupBy(
                t => t.Name.Substring(0, t.Name.Length - "Controller".Length),
                StringComparer.OrdinalIgnoreCase);
            _cache = groupedByName.ToDictionary(
                g => g.Key,
                g => g.ToLookup(t => t.Namespace ?? String.Empty, StringComparer.OrdinalIgnoreCase),
                StringComparer.OrdinalIgnoreCase);
          }
        }
      }
    

    【讨论】:

      【解决方案2】:

      是的,ControllerFactory 是您问题的最佳解决方案。

      public IController CreateController(RequestContext requestContext, string controllerName)
          {            
              BaseController controller;
      
              switch (controllerName.ToLower())
              {
                  case "product": case "products": controller = new MyProductController(); break;
                  case "home": controller = new MyHomeController(); break;
                  case "account": controller = new MyAccountController(); break;
                  default: controller = null; break;
              }
      
              return controller;
          }
      

      这是我的第一个 ControllerFactory - 但它非常愚蠢:) 你必须使用反射并避免这个丑陋的开关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多