アクションメソッドが呼び出される前にアクションメソッドパラメーター(ビューモデル)にアクセスできるASP.NET MVC(MVC4)に便利なフックはありますか(たとえば、アクションメソッドでチェックしたものの値に応じて)つまり、代わりに、ビュー モデル オブジェクト (アクション メソッドのパラメーター) を別のアクション メソッドに転送するか、何らかのビューに直接転送します (つまり、アクション メソッドでさらに処理を行うことなく)。
質問が理解できない場合は、以下のコード例を参照してください。これは、私が探しているコードの種類を示しているはずです... (ただし、そのような種類のインターフェイスが実際に存在し、実装をフックする可能性があるかどうかはわかりません) MVC フレームワーク)
これが実際に可能である場合は、その方法についてのコード例を含む回答を確認したいと思います (たとえば、「メソッド 'ActionFilterAttribute.OnActionExecuting' または 'IModelBinder.BindModel' を使用してみてください」などと誰かが主張する応答だけではありません。なぜなら、私はすでにそれらを試してみましたが、うまくいきませんでした)。また、このスレッドがそれを行う理由についての議論になることを望んでおらず、それを行う方法を見たいと思っていることを尊重してください. (つまり、「あなたは実際に何を達成しようとしていますか?」または「あなたがやりたいことをするよりも良いことがあるかもしれません...」などの回答で議論することに興味はありません)
以下の私自身のコードサンプルが説明しようとしているように、質問は3つのサブ質問/コード例に分割できます:(しかし、実際の既存の型を使用してREALコードに「リファクタリング」したい)一部」は私がでっち上げたもので、該当する実物を探しています…)
(1) 実際のアクション メソッドがビュー モデル オブジェクト パラメータで呼び出される前に、一般的な場所でビュー モデル オブジェクト (アクション メソッド パラメータ) へのアクセスを取得する (および場合によっては変更する) 方法の例。
私が探している種類のコード例は、おそらく以下に似ていますが、使用するインターフェイスの種類と、以下のようなことができるように登録する方法がわかりません。
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) 対象のアクションメソッドを実行させず、代わりに別のアクションメソッドを呼び出す例。この例は、上記の例を次のように拡張したものである可能性があります。
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) 通常のアクション メソッドが実行されないようにし、代わりにビュー モデル オブジェクトをそれ以上処理せずにビューに直接転送する方法の例。
この例は、上記の最初の例を次のように拡張したものです。
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);
}