2016-08-11 7 views
7

私は汎用アクションフィルタを持っており、OnActionExecutingメソッドで現在のモデルを取得したいと考えています。私の現在の実装は以下の通りです:アクションフィルタで現在のモデルを取得する方法

public class CommandFilter<T> : IActionFilter where T : class, new() 
{ 
     public void OnActionExecuting(ActionExecutingContext actionContext) 
     { 
      var model= (T)actionContext.ActionArguments["model"]; 
     } 
} 

私のすべてのモデル名が同じであればうまくいきます。しかし、私はdiffernetモデル名を使用したい。

この問題を解決するにはどうすればよいですか?

あなたはモデルへのアクセスを得るbase MVC ControllerActionExecutingContext.Controllerプロパティ

/// <summary> 
    /// Gets the controller instance containing the action. 
    /// </summary> 
    public virtual object Controller { get; } 

と変換した結果を使用することができます

public class HomeController : Controller 
{ 
    [ServiceFilter(typeof(CommandActionFilter<CreateInput>))] 
    public IActionResult Create([FromBody]CreateInput model) 
    { 
     return new OkResult(); 
    } 
} 
+0

のようなものhttp://stackoverflow.com/questions/872796/asp-net-mvc-accessing-view-model-from-a-customを書き込むことができた場合に-action-filter – user2184057

+0

@ user2184057これはビューモデル用であり、要求モデルではありません。 – Set

答えて

4

ActionExecutingContext.ActionArgumentsだけです

/// <summary> 
    /// Gets the arguments to pass when invoking the action. Keys are parameter names. 
    /// </summary> 
    public virtual IDictionary<string, object> ActionArguments { get; } 

ハードコードされたパラメータ名(「モデル」)を避ける必要がある場合は、ループする必要があります。 asp.netのためthe same SO answerから:

我々はいくつかの特定の要件に類似したオブジェクトのクラスで作業する必要がある一般的なアクションフィルタを作成するとき、私たちは私たちのモデルは、インターフェイスを実装かもしれない=>である引数を知っています私たちが作業しなければならないモデルであり、インタフェースを通してメソッドを呼び出すことができます。

あなたはこの

public void OnActionExecuting(ActionExecutingContext actionContext) 
{ 
    foreach(var argument in actionContext.ActionArguments.Values.Where(v => v is T))) 
    { 
     T model = argument as T; 
     // your logic 
    } 
} 
+0

"Tは" "Tとして"そのコードを改善するいくつかの方法ですか?あなたは私の視点から2回キャストしています.... –

4

編集:

((Controller)actionExecutingContext.Controller).ViewData.Model 
+0

キャスト例外をスローします。 'MyNamespace.HomeController'タイプのオブジェクトを 'Microsoft.AspNetCore.Mvc.Controller'にキャストできません。 –

+0

HomeControllerの定義を表示できますか? – Set

+0

申し訳ありませんが、私は 'コントローラ'の基本定義を忘れてしまった。私はコードを編集しましたが、現在はモデルがnullです(多分私は何かを見逃しています)。私の更新を見てください。 –

関連する問題