Sto provando a dare un'occhiata a tutti gli attributi di autenticazione che possono decorare i metodi di azione nei miei controller in un'applicazione MVC 3. Lo sto facendo con i miei metodi di estensione HtmlHelper che sono fondamentalmente wrapper di ActionLink (per darti il contesto di quali informazioni sono disponibili al runtime). Ho una soluzione di base, ma i metodi sovraccaricati lo hanno appena fatto esplodere. So che il framework sta risolvendo internamente gli url ai metodi di azione, ma dopo aver guardato attraverso il codice per System.Web.Mvc.LinkExtensions, non ho ancora trovato esattamente come sta accadendo, quindi sono un po 'bloccato su come per affrontare questo problema.Come recuperare gli attributi del metodo di azione richiesto
Ecco il codice che ho finora per risolvere il metodo in questione:
private static bool _IsUserAuthorized(HtmlHelper html,
string controllerName, string actionName)
{
controllerName = controllerName ??
html.ViewContext.RouteData.GetRequiredString("controller");
var factory = ControllerBuilder.Current.GetControllerFactory();
var controller = factory.CreateController(
html.ViewContext.RequestContext, controllerName);
Type controllerType = controller.GetType();
var methodInfo = controllerType.GetMethod(actionName,
BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
... check authentication
}
Quindi il mio problema attuale è che quando un metodo viene sovrascritto, ottengo "incontro ambiguo trovato" eccezioni. Sto indovinando che ho bisogno di elaborare il RouteValues per risolvere eventuali parametri del metodo in modo da poter identificare in modo univoco quello giusto. Qualcuno ha alcuni suggerimenti su come farlo? In alternativa, il framework fornisce già un mezzo per risolvere il metodo esatto necessario?
Grazie mille!
OK, così ho continuato a scavare nel codice sorgente MVC3 e sembra che ho bisogno di ottenere un'istanza ControllerDescriptor e l'uso per ottenere un ActionDescriptor per il metodo di azione appropriato. Quindi, se questo è il caso, come faccio a ottenere ControllerContext del controller appropriato quando il metodo di azione richiesto non è il controller in HtmlHelper.ViewContext.Controller? –
Ottenere un ControllerContext risulta essere piuttosto semplice. Ottenere un ControllerDescriptor, non così tanto. qualche idea? –
Codice trovato [qui] (http://weblogs.asp.net/jeffreyzhao/archive/2009/01/30/extend-asp-net-mvc-for-asynchronous-action.aspx) per ottenere ControllerDescriptor e ActionDescriptor. Avvicinarsi ... –