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

时间:2012-03-04 13:03:54

标签: controller asp.net-mvc-4 base-class

我有一个基本控制器类:

我所有的其他控制器都像这样继承了这个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();
    }
}

3 个答案:

答案 0 :(得分:28)

我能够重现你的问题。似乎ExecuteCore的使用已更改。但我没有找到任何有关它的信息。我猜这与现在Controller实现IAsyncController而不是AsyncController的事实有关。

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

将其添加到BaseContoller

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

来自DisableAsyncSupport的MSDN页面(强调我加入):

  

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

答案 1 :(得分: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。

答案 2 :(得分:7)

您也可以使用BeginExecuteCore

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