2010-06-10 34 views
8

C'è un modo per modificare la convenzione di denominazione per i controller in ASP.NET MVC?modifica convenzione nome controller in ASP.NET MVC

Quello che voglio è quello di nominare i miei controllori InicioControlador invece di InicioController, o meglio ancora, utilizzare un prefisso al posto di un suffisso, e hanno ControladorInicio come il mio nome del controller.

Da quanto ho letto finora, penso di dover implementare la mia Controller Factory. Sarei molto grato se qualcuno di voi potesse indicarmi la giusta direzione.

risposta

5

Sì, ControllerFactory è la migliore soluzione del problema.

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

Questo è il mio primo ControllerFactory - ma è molto stupido :) È necessario utilizzare riflessione e di evitare questo interruttore brutto.

13

Ho deciso di scavare un po 'più a fondo e ho trovato esattamente quello che stavo cercando dopo aver cercato attraverso il codice sorgente MVC. La convenzione per i nomi dei controller si trova nelle radici del framework MVC, in particolare in due classi ControllerDescriptor e ControllerTypeCache.

In ControllerDescriptor esso è dato dalla seguente attributo:

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

In ControllerTypeCache viene inviato dai seguenti metodi:

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