2010-06-10 1 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 Framework, особенно в двух классах 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); 
     } 
    } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^