在ASP.NET MVC变化控制器命名规则在ASP.NET MVC变化控制器命名规则(change

2019-05-12 05:13发布

有没有办法来改变在ASP.NET MVC控制器的命名惯例?

我要的是我的名字控制器InicioControlador代替InicioController ,或者更好的是,使用前缀,而不是一个后缀,并有ControladorInicio我的控制器名称。

从我迄今阅读,我想我要实现我自己的控制器厂。 我将不胜感激,如果你们能在正确的方向指向我。

Answer 1:

是的,是的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 - 但它是非常愚蠢的:)你必须使用反射和避免这种丑陋的开关。



Answer 2:

我决定要挖一个深一点,发现正是我一直在寻找通过MVC源代码中搜索后。 对于控制器名称的约定是MVC框架的根源深处,especifically在两类ControllerDescriptorControllerTypeCache

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


文章来源: change controller name convention in ASP.NET MVC