2016-04-14 18 views
13

L'operatore nameof appena introdotto è utile per rendere il mio codice "digitato".Esiste un operatore nameof() per i controller MVC in C#?

Invece di

return RedirectToAction("Edit"); 

possiamo scrivere

return RedirectToAction(nameof(Edit)); 

Ma per ottenere il nome di un controller non è così semplice, perché abbiamo un suffisso Controller. Voglio solo sapere se voglio avere un

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

a prendere il posto di

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

come possiamo implementare l'operatore controllernameof?

+0

No! Non esiste un operatore del genere. Hai scritto il parser del tuo nome personalizzato per ottenere il nome del controller. – vendettamit

+1

'nameof (IndexController) .Replace (" Controller "," ")' - o qualcosa di più robusto se si dispone di una classe 'RemoteControllerController' (che MVC potrebbe soffocare in ogni modo) –

+0

@DStanley Penso che intendessi' nameof (IndexController) .Replace ("Controller", "") ' – juharr

risposta

2

Forse un metodo di estensione come la seguente sarebbe adatto alle vostre esigenze:

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

cui si potrebbe richiamare in questo modo:

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

Bene, questo metodo verrà chiamato ogni volta che viene richiesta una route. L'operatore 'nameof' è alquanto migliore per quanto riguarda le prestazioni in quanto funziona in fase di compilazione. –

+0

Ottimo punto, @voroninp. Forse un metodo di estensione che prende solo il risultato di stringa di 'nameof (ControllerName)' sarebbe più efficiente, anche se anche l'uso di estensioni potrebbe non essere completamente performante. –

2

No, non c'è.

Cercare "T4MVC" in NuGet per una soluzione;). È "buono come si arriva".

1

La soluzione che risolve il caso del XControllerController apparirebbe più come:

String nameStr = nameof(FlightControllerController); 
nameStr = nameStr.Substring(0, nameStr.LastIndexOf("Controller")); 
Problemi correlati