2016-04-14 13 views
13

Toán tử nameof mới được giới thiệu hữu ích khi tạo mã của tôi "đã nhập".Có một toán tử nameof() cho các bộ điều khiển MVC trong C# không?

Thay vì

return RedirectToAction("Edit"); 

chúng ta có thể viết

return RedirectToAction(nameof(Edit)); 

Nhưng đối để có được tên của một bộ điều khiển mà không phải là đơn giản, bởi vì chúng tôi có một hậu tố Controller. Chỉ muốn biết nếu tôi muốn có một

return RedirectToAction(nameof(Index), controllernameof(Home)); 

để chiếm chỗ của

return RedirectToAction("Index", "Home"); 

thế nào chúng ta có thể thực hiện các nhà điều hành controllernameof?

+0

Không! Không có toán tử nào tồn tại. Bạn đã viết trình phân tích cú pháp tên tùy chỉnh của bạn để lấy tên của bộ điều khiển. – vendettamit

+1

'nameof (IndexController) .Replace (" Controller "," ")' - hoặc một cái gì đó mạnh mẽ hơn nếu bạn có một lớp 'RemoteControllerController' (MVC có thể bị ngắt trên anyways) –

+0

@DStanley Tôi nghĩ bạn có nghĩa là' nameof (IndexController) .Replace ("Controller", "") ' – juharr

Trả lời

2

Có lẽ một phương pháp mở rộng như sau sẽ phù hợp với nhu cầu của bạn:

public static class ControllerExtensions 
{ 
    public static string ControllerName(this Type controllerType) 
    { 
    Type baseType = typeof(Controller); 
    if (baseType.IsAssignableFrom(controllerType)) 
    { 
     int lastControllerIndex = controllerType.Name.LastIndexOf("Controller"); 
     if (lastControllerIndex > 0) 
     { 
      return controllerType.Name.Substring(0, lastControllerIndex); 
     } 
    } 

    return controllerType.Name; 
    } 
} 

nào bạn có thể gọi như vậy:

return RedirectToAction(nameof(Index), typeof(HomeController).ControllerName()); 
+0

Vâng, phương pháp này sẽ được gọi là mỗi tuyến đường thời gian được yêu cầu. Toán tử 'nameof' có phần tốt hơn về hiệu năng khi nó hoạt động tại thời gian biên dịch. –

+0

Điểm rất tốt, @voroninp. Có lẽ một phương pháp mở rộng mà chỉ cần kết quả chuỗi của 'nameof (ControllerName)' sẽ có hiệu quả hơn - mặc dù thậm chí sử dụng các phần mở rộng ở tất cả có thể không được thực hiện đầy đủ. –

2

Không, không có.

Tra cứu "T4MVC" trong NuGet để biết giải pháp;). Đó là "tốt như nó được".

1

Các giải pháp mà giải quyết trường hợp của XControllerController sẽ trông như thế hơn:

String nameStr = nameof(FlightControllerController); 
nameStr = nameStr.Substring(0, nameStr.LastIndexOf("Controller")); 
Các vấn đề liên quan