2010-01-12 11 views
5

Ich habe ein Actionfilter, dass ich OnActionExecuting in ASP.NET MVC 2 ausführen. Im Wesentlichen möchte ich das Actionfilter meine Daten bereinigen und das aktuelle Modell ersetzen (die an nachfolgende Aktion Filter übergeben wird und auch meine Aktionsmethode) mit dem desinfizierten Modell. Ist das möglich und ist es eine schlechte Idee - wenn ja, warum?Ändern Sie ein Modell in einem ActionFilter

Vielen Dank im Voraus, JP

+0

Smells schlechtes Design. –

+7

Filip, wenn du kritisieren willst, dann sei bitte konstruktiv. Sag mir, warum es schlechtes Design ist, sag mir, was du als gute Alternativen siehst ... sonst ist dein Kommentar nutzlos für mich und alle anderen, die diesen Beitrag lesen ... –

Antwort

5

Wenn Sie mit Ihren Modellen müssen beschäftigen, sind Sie wahrscheinlich im Rahmen eines einzelnen Controllers gehen werden, um mehr zu tun (es sei denn, alle benutzen, um Ihre Controller die gleichen Modelltypen ?). Ein alternativer Ansatz würde darin bestehen, die OnActionExecuting() und OnActionExecuted() Methoden der Controller selbst außer Kraft zu setzen. Auf diese Weise können Sie Ihre Geschäftslogik innerhalb des Steuerungsbereichs halten.

Im Allgemeinen werden ActionFilter für übergreifende Probleme verwendet - etwas, das Sie für viele Aktionsmethoden ausführen möchten, unabhängig davon, wo sie in der App vorhanden sind. Wenn Ihre Modell-Sanitisierungslogik also nicht auf viele Controller und Aktionen angewendet wird oder sehr allgemein ist (was vielleicht der Fall ist, in diesem Fall ist Ihr Ansatz wahrscheinlich gut), sollten Sie sie aus den Filtern und in Ihre Controller holen. Wenn es etwas ist, das breit angewendet werden kann, dann ist ein ActionFilter in Ordnung.

+0

Ich sehe definitiv deinen Standpunkt, aber die Desinfektion ist sehr ein CCC und wird über Controller und Aktionsmethoden hinweg verwendet. –

6

für MVC Hier v1, ich hoffe, dass dies nicht in v2 geändert wird:

var view = filterContext.Result as ViewResultBase; 
if (view != null) 
    view.ViewData.Model ... 

Ich verstehe nicht, warum Sie es in OnActionExecuting tun wollen, aber wenn Sie Muss, tun es es, und setzen Sie eine Markierung (privates Feld), dass OnActionExecuted das resultierende Modell optimieren muss. Aber Sie müssen das letztere trotzdem verwenden, außer wenn Sie das .Result zuweisen - in diesem Fall wird Ihre Aktion überhaupt nicht aufgerufen und das zugewiesene Ergebnis wird verwendet.

+0

Ich versuche auf das Modell OnActionExecuting zuzugreifen (dh bevor die Aktion ausgeführt wird). In diesem Fall gibt das Modell immer null zurück. –

+0

Ich hätte expliziter sein sollen - der Grund, warum ich OnActionExecuting machen will (muss) Damit kann ich noch den ValidateInput Filter auslösen (und muss ihn nicht ausschalten !!!). Wenn meine Eigenschaften zu diesem Zeitpunkt HTML enthalten, werden sie als gefährlich markiert und der Filter wird fehlschlagen (mangels eines besseren Begriffs). Die Daten müssen vor dem zweiten Filter aktualisiert werden, daher ist OnActionExecuted zu spät ... –

2

BTW, für MVC 3 & 4:

filterContext.Controller.ViewData.Model 
Verwandte Themen