2016-06-01 8 views
2

私は奇妙な問題を抱えていますが、これを解決する方法が何であるかは100%わかりません。ベースビューを使用したASP.NET MVC継承コントローラ

考えるMVCコントローラ、BaseController(以下ミニマル例)

BaseController : Controller 
{ 
    public ActionResult LotsOfActions() 
    { 
     //this calls a view that renderActions AnAction(SomeModel) a bunch of times. 
    } 

    public ActionResult AnAction(Object SomeModel) 
    { 
     //do stuff 
     return View("AnAction",TemplateFromCode,ViewModel); //Depending on something in SomeModel, we want a different template for this. 
    } 
} 

DerivedController : BaseController 
{ 
    public override ActionResult LotsOfActions() 
    { 
     //this calls a view that renderActions BaseController.AnAction(SomeModel) a bunch of times but with different logic. 
    } 
} 

AnActionがDerivedControllerに呼び出されると、DerivedController/AnAction.cshtml(または任意の名前)、私は必要としない使用しようとしていますサブビューが同じでなければならないので、ビューが見つかりません。エラーが発生します。 BaseController/AnAction.cshtmlを私が意図した通りに使う方法を教えてください。 BaseControllerのサブクラスである他のものに対してこのビューをオーバーライドしたい場合、DerivedControllerの前にスキャンされているため、共有ビューフォルダを使用したくないです。

+1

あなたは自分のベースコントローラに明示することができます: '〜"(ビューを返します/Views/Base/AnAction.cshtml "..." – DavidG

+0

これは...驚くほど明白でした。実際にはありがたいです。これを回答としてドロップすると、すぐに回答としてマークされます。 、しかしねえ。 – ASpencer

答えて

2

最も簡単な方法は、このように、単にビューへのフルパスを指定することで、あなたのベースクラスに明示することである。

public ActionResult AnAction(Object SomeModel) 
{ 
    //do stuff 
    return View("~/Views/Base/AnAction.cshtml",TemplateFromCode,ViewModel); 
} 
1

Base Controllerを継承するのではなく、AnActionを呼び出す何も持っていないのがなぜそのコントローラーを呼び出すのですか?通常、コントローラの継承は内部の詳細に使用され、パブリックアクションメソッドのオーバーライドには使用されません。

そうでなければ、ビューパスはベースコントローラーではなく、実現されたコントローラーの位置から自動構築されるため、DavidGが示唆したことに固執しています。

関連する問題