Non ci ha detto perché avete bisogno di questo, ma una possibilità è quella di utilizzare la riflessione:
public List<string> ActionNames(string controllerName)
{
var types =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where typeof(IController).IsAssignableFrom(t) &&
string.Equals(controllerName + "Controller", t.Name, StringComparison.OrdinalIgnoreCase)
select t;
var controllerType = types.FirstOrDefault();
if (controllerType == null)
{
return Enumerable.Empty<string>().ToList();
}
return new ReflectedControllerDescriptor(controllerType)
.GetCanonicalActions().Select(x => x.ActionName)
.ToList();
}
Ovviamente come sappiamo riflessione non è molto veloce, quindi se intendi chiamare questo metodo spesso potresti considerare di migliorarlo memorizzando nella cache l'elenco dei controller per evitare di scaricarlo sempre e persino il metodo memoizing per i parametri di input forniti.
fonte
2012-07-03 06:18:03
Ho intenzione di mettere un commento qui, perché è generale. Per quello che stai cercando di fare (nomi di azioni del controller) non è il modo in cui dovrebbe essere fatto. Potrebbero esserci diverse azioni con lo stesso nome e alcune potrebbero essere solo Ajax, ecc. Ecc. Le tue autorizzazioni dovrebbero essere basate su azioni diverse da quelle del controller. –