Bla*_*eaf 26 controller base-class asp.net-mvc-4
我有一个基本控制器类:
而我所有的其他控制器都像这样继承了这个BaseClass
所有这些在MVC3中运行良好(今天再次测试,它确实有效)但似乎在MVC 4 beta中不再触发BaseController中的ExecuteCore.
任何的想法?或者任何巨大的变化都在引擎盖下?非常感谢.
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();
    }
}
nem*_*esv 28
我能够重现你的问题.似乎ExecuteCore改变了用法.但我没有找到任何有关它的信息.我的猜测是因为现在的Controller工具IAsyncController不是AsyncController.
但是我找到了一个解决方法来获取MVC4的旧行为:
将此添加到BaseContoller:
protected override bool DisableAsyncSupport
{
    get { return true; }
}
从DisableAsyncSupport的MSDN页面(强调由我添加):
此标志用于向后兼容.ASP.NET MVC 4.允许控制器支持异步模式.这意味着
ExecuteCore不会在派生类上调用它.派生类可以覆盖此标志,并设置为true是否仍需要ExecuteCore调用它们.
Alf*_*ñoz 28
我投了nemesv的答案,因为它给了我一个关于发生了什么的解释.我有MVC3和MVC4项目,这让我很生气.
但是我有另一种解决方案.在Controller类中覆盖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.
小智 7
您也可以使用BeginExecuteCore
protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
    return base.BeginExecuteCore(callback, state);
}