2010-06-10 33 views
8

Có cách nào để thay đổi quy ước đặt tên cho bộ điều khiển trong ASP.NET MVC không?thay đổi tên điều khiển quy ước trong ASP.NET MVC

Điều tôi muốn đặt tên cho bộ điều khiển InicioControlador thay vì InicioController hoặc tốt hơn, sử dụng tiền tố thay vì hậu tố và có ControladorInicio làm tên bộ điều khiển của tôi.

Từ những gì tôi đã đọc cho đến nay, tôi nghĩ mình phải triển khai Nhà máy điều khiển của riêng mình. Tôi sẽ rất biết ơn nếu có ai trong số các bạn có thể chỉ cho tôi đúng hướng.

Trả lời

5

Có, ControllerFactory là giải pháp tốt nhất cho vấn đề của bạn.

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

Đây là ControllerFactory đầu tiên của tôi - nhưng nó rất ngu ngốc :) Bạn phải sử dụng phản chiếu và tránh công tắc xấu xí này.

13

Tôi quyết định đào sâu hơn một chút và tìm thấy chính xác những gì tôi đang tìm kiếm sau khi tìm kiếm thông qua mã nguồn MVC. Quy ước cho tên bộ điều khiển nằm sâu bên trong gốc của khung MVC, đặc biệt trong hai lớp ControllerDescriptorControllerTypeCache.

Trong ControllerDescriptor nó được đưa ra bởi các thuộc tính sau:

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

Trong ControllerTypeCache nó được đưa ra bởi các phương pháp sau:

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); 
     } 
    } 
    } 
Các vấn đề liên quan