2010-06-10 18 views
8

Gibt es eine Möglichkeit, die Namenskonvention für Controller in ASP.NET MVC zu ändern?Controller-Namenskonvention in ASP.NET ändern MVC

Was ich will, ist meine Controller InicioControlador statt InicioController, oder besser noch zu nennen, ein Präfix anstelle eines Suffix verwenden, und ControladorInicio wie mein Controller Namen haben.

Von dem, was ich bisher gelesen habe, denke ich, dass ich meine eigene Controller Factory implementieren muss. Ich wäre sehr dankbar, wenn einer von euch mich in die richtige Richtung weisen könnte.

Antwort

5

Ja, ControllerFactory ist die beste Lösung für Ihr Problem.

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

Dies ist meine erste ControllerFactory - aber es ist sehr dumm :) Sie müssen Reflexion verwenden und diesen hässlichen Schalter vermeiden.

13

Ich entschied mich, ein bisschen tiefer zu graben und fand genau das, wonach ich suchte, nachdem ich den MVC-Quellcode durchsucht hatte. Die Konvention für Controller-Namen liegt tief in den Wurzeln des MVC-Frameworks, insbesondere in den beiden Klassen ControllerDescriptor und ControllerTypeCache.

In ControllerDescriptor wird es durch das folgende Attribut angegeben:

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 es durch die folgenden Verfahren angegeben:

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