2010-06-10 96 views
8

有沒有辦法改變ASP.NET MVC中控制器的命名約定?更改ASP.NET MVC中的控制器名稱約定

我想要的是命名我的控制器InicioControlador而不是InicioController,或更好的方法是使用前綴而不是後綴,並將ControladorInicio作爲我的控制器名稱。

從我目前閱讀的內容來看,我想我必須實現自己的控制器工廠。如果你們中的任何一位能夠指引我朝着正確的方向,我將非常感激。

回答

5

是的,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 - 但它是非常愚蠢的:)你必須使用反射和避免這種醜陋的開關。

13

我決定深入一點,在搜索完MVC源代碼後發現我正在尋找的東西。控制器名稱的約定深入到MVC框架的根內部,特別是在兩個類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); 
     } 
    } 
    }