2012-03-04 17 views
26

では発生しません、実際には動作しますが)、BaseControllerのExecuteCoreはMVC 4ベータ版ではもう起動していないようです。ExecuteCoreは()私は基本コントローラクラスを持っているMVC 4ベータ版

または何か巨大なものがボンネットの下で変更されましたか?どうもありがとう。

public class BaseController : Controller 
{ 
    private string _myData; 

    public string MyData 
    { 
     get 
     { 
      return _myData; 
     } 
    } 

    protected override void ExecuteCore() 
    { 
     _myData = "I am doing something"; 

     base.ExecuteCore(); 
    } 
} 


public class HomeController : BaseController 
{ 
    public ActionResult Index() 
    { 
     ViewBag.MyData = MyData; 
     // Doing something with value in BaseClass 

     return View(); 
    } 
} 

答えて

28

問題を再現できました。 ExecuteCoreの使用が変更されたようです。しかし、私はそれに関する情報は見つけていません。私の推測では、ControllerIAsyncControllerが実装されていて、AsyncControllerではないという事実に関係しています。 (強調は私が追加)DisableAsyncSupportのためのMSDNのページから

protected override bool DisableAsyncSupport 
{ 
    get { return true; } 
} 

BaseContollerにこれを追加:私はMVC4で古い振る舞いを得るために回避策を見つけたが

このフラグは、下位互換性のためのものです。 ASP.NET MVC 4.コントローラが非同期パターンをサポートできるようにします。つまり、派生クラスではExecuteCoreが呼び出されません。 派生クラスはこのフラグをオーバーライドし、依然としてExecuteCoreが呼び出される必要がある場合はtrueに設定できます。

+5

感謝を使用することができます。 MVCチームが本当に何かを変えたようです。 私はこれを解決する可能性がある別の回避策を持っています: ExecuteCoreではなく、正しく起動されるBaseClassのOnActionExecutingをオーバーライドします。 – BladeLeaf

+1

現時点では、MSDNページは空ではなく、「このフラグは下位互換性のためのものです」ASP.NET MVC 4.コントローラが非同期パターンをサポートできるようになりました。クラスはこのフラグをオーバーライドし、依然ExecuteCoreを呼び出す必要がある場合はtrueに設定できます。つまり、あなたのソリューション/回避策は有効です。 – huhu78

28

私は何が起こっているのかについて私に説明してくれたので、私は投票しました。私はMVC3とMVC4プロジェクトを持っており、これは私を怒らせていました。

しかし私には別の解決策があります。コントローラクラスのInitializeメソッドをオーバーライド:

public abstract class BaseController : Controller 
{ 
    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
    string languageId = "en"; 
    try{ 
     // all your code here. You have access to all the context information, 
     // like querystring values: 
     string languageId = requestContext.HttpContext.Request.QueryString["lang"]; 
     Thread.CurrentThread.CurrentUICulture = 
      CultureInfo.CreateSpecificCulture(languageId); 
    } 
    finally 
    { 
     Thread.CurrentThread.CurrentUICulture = 
     CultureInfo.CreateSpecificCulture(languageId); 
    } 

    base.Initialize(requestContext); 
    } 
} 

は、次に、あなたのプロジェクトにちょうどあなたのコントローラがBaseControllerから継承し、それがすべてであることを確認、BaseControllerコールは自動的に要求コンテキストを渡して動作します。 MVC3とMVC4の両方で動作します。

+0

これはカスタムモデルバインダーでも機能しますか?モデルバインダーが呼び出されたときにスレッドカルチャが正しく設定されていますか? – Rookian

+0

あなたのソリューションは素晴らしいアプローチですAlphonzo。これはまさにExecuteCore()の正しい代替手段であり、MVC5で動作します。コントローラのMSDNドキュメントは次のとおりです。メソッドの初期化:http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.initialize(v=vs.118).aspx – GDB

+0

ニースは知っていますが、それは私のためには機能しませんでした初期化が開始された時点でまだインスタンス化されていないdbコンテキストとセッション変数にアクセスする必要があるためです。 BeginExecuteCoreは代わりに私の仕事をしました。 – ZipionLive

7

また、コメントBeginExecuteCore

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
{ 
    return base.BeginExecuteCore(callback, state); 
} 
+0

MVCでうまくいきます。4.素敵でシンプルです。 –

+0

あなたはちょうど私のための日を保存しました、ありがとう! – ZipionLive

関連する問題