Asp.NET MVC ModelBinder, erhält die Aktionsmethode

9

Ich habe einen benutzerdefinierten ModelBinder und ich möchte die Aktion erhalten. Da ich die Attribute der Aktion über Reflektion erhalten möchte, reicht der Name der Aktion nicht aus.

meine Aktionsmethode:

%Vor%

und hier ein typischer ModelBinder

%Vor%

irgendwelche Vorschläge, andere Lösungen?

vielen Dank im Voraus

    
dknaack 01.06.2011, 08:14
quelle

3 Antworten

4

Nein, Sie können nicht mit 100% iger Sicherheit die aktuelle Aktion von einem Modellbinder erhalten. Der Modellbinder ist nicht an die Aktion gekoppelt, sondern an die Bindung an ein Modell. Zum Beispiel können Sie

anrufen %Vor%

In einem Filter, bevor eine Aktion ausgewählt wurde. Beachten Sie auch, dass eine Aktionsmethode möglicherweise nicht einmal eine CLR-Methode ist (siehe Ссылка ), die reflektiert werden können.

Ich denke, die wirkliche Frage ist, was genau versuchen Sie zu erreichen, und ist das der richtige Weg? Wenn Sie möchten, dass Informationen aus der Aktion an den Modellbinder übergeben werden (beachten Sie den Hinweis, dass Ihr Modellbinder ordnungsgemäß reduziert werden sollte, wenn die Informationen nicht vorhanden sind), sollten Sie einen Aktionsfilter verwenden, um die Informationen in HttpContext.Items (oder irgendwo so, und dann lassen Sie Ihre Mappe es abrufen.

Die OnActionExecuting-Methode eines Aktionsfilters empfängt einen ActionExecutingContext mit einem ActionDescriptor. Sie können GetCustomAttributes dafür aufrufen.

    
Haacked 01.06.2011, 16:03
quelle
1

Du könntest das versuchen:

%Vor%     
Fabiano 01.06.2011 12:34
quelle
0

Sie können ControllerActionInvoker.FindAction() überschreiben, um das Attribut der Aktion zu erhalten, und es in HttpContext.Current.Items wie hier erwähnt oder in ControllerContext.RequestContext wie folgt speichern:

%Vor%

Der Standardaktionsinvoker wird entweder im Konstruktor des Controllers oder in einer benutzerdefinierten Controller-Factory ersetzt:

%Vor%

Übrigens enthält Controller.TempData bereits ein Element ReflectedParameterDescriptor type, mit dem Sie auf ActionDescriptor zugreifen können, sodass der obige Code redundant sein kann. Beachten Sie jedoch, dass dies implementierungsspezifisch ist und sich daher im Laufe der Zeit ändern kann.

Abschließend rufen Sie das Attribut aus diesem Speicher in Ihrer Binderklasse ab:

%Vor%     
Herman Kan 26.11.2016 10:58
quelle