2016-04-14 10 views
1

コントローラの1つでは、すべてのビューに固定の前処理があります。以下のコードの代わりにこれを行うより良い方法がありますか?そのようなSomeFunctionAsync戻る前にその行を書くことなく動作しますのすべての機能のためのビュー()戻りますこのコントローラのビュー()?私はまた、いくつかのajax投稿機能を持っています。View ControllerのView関数に共通のコードを入れる場所は?

つまり
public async Task<ActionResult> View1() 
{ 
    await SomeFunctionAsync(); 
    return View(); 
} 

public async Task<ActionResult> View2() 
{ 
    await SomeFunctionAsync(); 
    return View(); 
} 

に、最後に私は次のように書くことができるようにしたいと同じ効果

public async Task<ActionResult> View1() 
{ 
    return View(); 
} 

public async Task<ActionResult> View2() 
{ 
    return View(); 
} 
+0

コントローラにはビューがありません。また、何を求めているのですか? 「共通コード」は、通常、メソッドに抽出してそのメソッドを呼び出すことを意味します。あなたはそのコードをどこに保管するか、またはその呼び出しを取り除く方法とその理由を尋ねていますか?たとえば、フィルタを作成することはできますが、これらは複雑さを増します。 –

+0

私は呼び出しを取り除きたいです。現在のところ、その関数は私のコントローラ内の私的関数です。ビューを返すすべての関数はそれを呼び出す必要があります。 –

+0

おそらく結果にビュー名を渡すことはできませんか?単一のアクションは、異なるビューを使用してレンダリングすることができます。あなたのメソッド 'View1'、' View2'を呼び出すのではなく、 'Create'や' return View( "View1") 'や' return View( "View2") ' –

答えて

0

を持つあなたは、コントローラの基本クラスを作成することができ、それぞれのビューを持っていますあなたのコードで一般的なメソッドを呼び出します。メソッド名としてGetViewを使用します(または既存のメソッドをオーバーライドできます)。そのよう

public class MyControllerBase : Controller { 

    public Task<ActionResult> GetView() { 
     yourCommonMethod(); 
     return View(); 
    } 

    public Task<ActionResult> GetView(string viewName) { 
     yourCommonMethod(); 
     return View(viewName); 
    } 

    public Task<ActionResult> GetView(object model) { 
     yourCommonMethod(); 
     return View(model); 
    } 


    public Task<ActionResult> GetView(string viewName, object model) { 
     yourCommonMethod(); 
     return View(viewName, model); 
    } 

} 

は、その後、あなたのコントローラで、その継承:

public class MyController : MyControllerBase { 

    public async Task<ActionResult> View1() 
    { 
     return GetView(); 
    } 

} 

を一般的な方法は、すべてのコントローラで同じであると何のコントローラ固有の依存関係を持っていない場合、それは可能性がありそれは簡単です。しかし、ジェネリックスを使って調べることもできます:

public class MyControllerBase<T> : Controller { 
    // base class stuff here based on type T's interface 
} 


public class MyController : MyControllerBase<MyController> { 
    // regular class here, sending MyController to the base 
} 

これはOOPのかなりのビルディングブロックです。あなたは、OOPの基礎をカバーし、この種のものを通して働く本を手に入れることができます。

0

が牽引方法があります。

  1. は、あなたがあれば作ることができ、戻りビュー(「View1を」)などの異なるビューを持つ単一のアクションを使用するか、ビュー(「VIEW2」)をretrun必要になりますので、そこに他の条件あなたの機能を一箇所で呼び出すことができます。

  2. あなたの現在の手順(推奨されません)と一緒に行きたいなら、あなたは、アクションフィルタ属性を使用してコントローラのレベルでそれを飾るために必要があり、その後、すべてのアクションがあなたのアクション

2
の実行前に、あなたのロジックを実行します

バランが提案したアクションフィルタがあなたに合わない場合、別の方法で試すことができます。

すべてのビューの親ビューを作成します。親ビューのアクションメソッド。このメソッドSomeFunctionAsync()を呼び出します。したがって、あなたのすべてのビューに対して親ビューが呼び出され、必要なメソッドが実行されます。

関連する問題