ASP.NET MVC 4, wie der Zugriff/ändern der view-model-Objekt (und die Ansicht ändern und die action-Methode), bevor es als action-parameter der Methode?

Ist es nützlich, Haken in ASP.NET MVC (MVC4), das lassen Sie Zugriff auf die Action-Methode-parameter (View-Modell), bevor die action Methode wird aufgerufen, und dann auch noch (z.B. je nach dem Wert von etwas, das Sie bei der Prüfung in der action-Methode-parameter) können Sie verhindern, dass die action-Methode aufgerufen wird, d.h. statt "vorwärts" das view-model-Objekt (action method parameter) auf einen anderen action-Methode oder direkt anzeigen (also ohne weitere Verarbeitung in einer action-Methode) ?

Wenn Sie nicht verstehen, die Frage, bitte siehe code-Beispiel unten, die illustrieren sollten die Art von code, ich bin auf der Suche nach...
(obwohl ich weiß nicht, ob es tatsächlich existiert eine solche Art der Schnittstelle und die Möglichkeit, ein Haken, eine Umsetzung in das MVC-framework)

Wenn dies tatsächlich möglich wäre, würde ich mag, um zu sehen, eine Antwort mit code Beispiel darüber, wie Sie es tun (und nicht nur eine Antwort mit jemandem, der behauptet, dass z.B. "versuchen Sie es mit Methode 'ActionFilterAttribute.OnActionExecuting' oder 'IModelBinder.BindModel' ", weil ich bereits versucht, und konnte nicht damit es funktioniert).
Auch, bitte beachten Sie, dass ich nicht wollen, dass dieser thread zu einer Diskussion über WARUM, es zu tun, aber wollen, um zu sehen WIE, es zu tun.
(d.h. ich bin nicht daran interessiert, in Gesprächen mit Antworten wie "Was bist du eigentlich versucht zu erreichen?" oder "Es gibt wahrscheinlich bessere Dinge zu tun, was Sie wollen...")

Die Frage kann aufgeteilt werden in drei Unterfragen/code-Beispiele, die wie meine eigenen code-Beispiele unten versuchen zu verdeutlichen:
(aber möchte Sie "Refactor" in REAL code mit der Nutzung des real-existierenden Arten)
(natürlich, jede Art unten enthält den substring "Einige" ist etwas, was ich habe, und ich bin auf der Suche nach den entsprechenden realen Sache ...)

(1) Beispiel, wie man Zugriff auf (und möglicherweise ändern) view-model-Objekte (action method Parameter) in einem generischen, bevor die eigentliche action-Methode aufgerufen wird, mit dem view-model-Objekt parameter.

Die Art von code, Beispiel ich Suche wäre wahrscheinlich ähnlich unter, aber nicht wissen, welche Art von Schnittstelle Sie verwenden und wie, um es zu registrieren, um in der Lage sein, etwas zu tun, wie unten:

public class SomeClass: ISomeInterface { //How to register this kind of hook in Application_Start ?
  public void SomeMethodSomewhere(SomeActionMethodContext actionMethodContext, object actionMethodParameterViewModel) {
    string nameOfTheControllerAboutToBeInvoked = actionMethodContext.ControllerName;
    string nameOfTheActionMethodAboutToBeInvoked = actionMethodContext.MethodName;
    //the above strings are not used below but just used for illustrating that the "context object" contains information about the action method to become invoked by the MVC framework
    if(typeof(IMyBaseInterfaceForAllMyViewModels).IsAssignableFrom(actionMethodParameterViewModel.GetType())) {
        IMyBaseInterfaceForAllMyViewModels viewModel = (IMyBaseInterfaceForAllMyViewModels) actionMethodParameterViewModel;
        //check something in the view model:
        if(viewModel.MyFirstGeneralPropertyInAllViewModels == "foo") {
            //modify something in the view model before it will be passed to the target action method
            viewModel.MySecondGeneralPropertyInAllViewModels = "bar";
        }
    }
  }
}

(2) Beispiel dafür, wie um zu verhindern, dass die gezielte action-Methode ausgeführt wird, und stattdessen ein anderes aufrufen-Aktion-Methode.
Das Beispiel ist eine Erweiterung des obigen Beispiels, wie so etwas wie unten:

    public void SomeMethodSomewhere(SomeActionMethodContext actionMethodContext, object actionMethodParameterViewModel) {
        ... same as above ...
        if(viewModel.MyFirstGeneralPropertyInAllViewModels == "foo") {
            actionMethodContext.ControllerName = "SomeOtherController";
            actionMethodContext.MethodName = "SomeOtherActionMethod";
            //The above is just one example of how I imagine this kind of thing could be implemented with changing properties, and below is another example of doing it with a method invocation:
            SomeHelper.PreventCurrentlyTargetedActionMethodFromBecomingExecutedAndInsteadExecuteActionMethod("SomeOtherController", "SomeOtherActionMethod", actionMethodParameterViewModel);
            //Note that I do _NOT_ want to trigger a new http request with something like the method "Controller.RedirectToAction"
        }           

(3) Beispiel dafür, wie um zu verhindern, dass die normalen action-Methode ausgeführt wird und anstatt nach vorne das view-model-Objekt auch direkt zu einer Ansicht, ohne jede weitere Verarbeitung.

Beispiel wäre eine Erweiterung der ersten obigen Beispiel, mit so etwas wie unten:

    public void SomeMethodSomewhere(SomeActionMethodContext actionMethodContext, object actionMethodParameterViewModel) {
        ... same as the first example above ...
        if(viewModel.MyFirstGeneralPropertyInAllViewModels == "foo") {
            //the below used razor view must of course be implemented with a proper type for the model (e.g. interface 'IMyBaseInterfaceForAllMyViewModels' as used in first example above)
            SomeHelper.PreventCurrentlyTargetedActionMethodFromBecomingExecutedAndInsteadForwardViewModelToView("SomeViewName.cshtml", actionMethodParameterViewModel);
        }
InformationsquelleAutor user310457 | 2013-01-21
Schreibe einen Kommentar