Compilerfehler ist ziemlich klar, können Sie jede Methode nicht aufrufen, wenn ein Attribut deklarieren (weil ihr Wert zum Zeitpunkt der Kompilierung bekannt sein muss), aber Sie können von AuthorizeAttribute
ausführen alle Ihre eigenen Attribut, abgeleitet herleiten Logik, die du brauchst. Ist es nicht das, was wir alle gemacht haben, um NameAttribute
& Freunde zu lokalisieren, bevor Sie lange auf lokalisierungsbewusste Datenanmerkungen warten?
Proof-of-Concept:
class DynamicAuthorizeAttribute : AuthorizeAttribute {
protected bool AuthorizeCore(HttpContextBase context) {
// Perform your logic here, eventually update Roles property
}
}
Und dann:
[DynamicAuthorize]
public ActionResult Get() {
// ...
}
Dies ist nur ein Art und Weise, dort können Sie Ihre eigene Logik setzen oder einfach Roles
Eigenschaft aktualisieren und delegieren üblichen Logik einfach anrufen base.AuthorizeCore(context)
. Beachten Sie, dass der gesamte Code hier threadsicher sein muss.
Wenn Sie mit statischen Methoden arbeiten und Sie wollen, dass die Logik in Ihrem Controller halten, dann können Sie spielen, um so etwas zu übernehmen (zum Beispiel):
[DynamicAuthorize(typeof(MyView), nameof(GetRole))]
Beachten Sie, dass Sie Controller zugreifen können und zeigen Namen von context.HttpContext.Request.RequestContext.RouteData
.
Dann rufen Sie solche statische Methode. Beachten Sie, dass, wenn die Logik wirklich komplex ist und stark variiert, Sie diese Logik möglicherweise zentralisieren und andere MVC Werkzeuge verwenden, um dies zu tun.
Sie können nicht. Nur Parameterwerte, die zur Kompilierzeit aufgelöst werden können, werden akzeptiert. –
Attribute werden nicht als Code gespeichert, sie werden als Metadaten gespeichert. Aus diesem Grund können Sie nur eine begrenzte Anzahl von Konstrukten darin verwenden. –