基类中的ExecuteCore()未在MVC 4 beta中触发

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

nem*_*esv 28

我能够重现你的问题.似乎ExecuteCore改变了用法.但我没有找到任何有关它的信息.我的猜测是因为现在的Controller工具IAsyncController不是AsyncController.

但是我找到了一个解决方法来获取MVC4的旧行为:

将此添加到BaseContoller:

protected override bool DisableAsyncSupport
{
    get { return true; }
}
Run Code Online (Sandbox Code Playgroud)

DisableAsyncSupport的MSDN页面(强调由我添加):

此标志用于向后兼容.ASP.NET MVC 4.允许控制器支持异步模式.这意味着ExecuteCore不会在派生类上调用它.派生类可以覆盖此标志,并设置为true是否仍需要ExecuteCore调用它们.

  • 感谢您的评论.似乎MVC团队真的改变了一些东西.我有另一个解决方法可以解决这个问题:我重写了BaseClass中的OnActionExecuting而不是ExecuteCore,它被正确触发. (5认同)

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的项目中让你的控制器继承自BaseController,这就是全部,BaseController调用自动传递请求上下文.它适用于MVC3和MVC4.


小智 7

您也可以使用BeginExecuteCore

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
    return base.BeginExecuteCore(callback, state);
}
Run Code Online (Sandbox Code Playgroud)