2012-03-04 34 views
26

没有解雇我有一个基本的控制器类:今天再次ExecuteCore()在基类中的MVC 4测试版

和我所有的其他控制器继承此BaseClass的这样

所有这一切都在MVC3的伟大工程(试验,它确实有效),但似乎BaseController中的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的使用情况发生了变化。但我还没有找到任何有关它的信息。我猜这与Controller实现IAsyncController而不是AsyncController这一事实有关。

不过,我已经找到了解决办法得到旧的行为与MVC4:

一下添加到BaseContoller

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

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

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

+5

感谢您的评论。 MVC团队似乎真的改变了一些事情。 我有另一个解决这个问题的解决方法: 取代了ExecuteCore,我重写了BaseClass中的OnActionExecuting,它被正确触发。 – BladeLeaf 2012-03-05 01:48:52

+1

此时,MSDN页面不为空,并包含以下备注:“此标志用于向后兼容,ASP.NET MVC 4.允许控制器支持异步模式,这意味着ExecuteCore不会在派生类上调用。类可以重写此标志,如果仍然需要调用ExecuteCore,则设置为true。“这意味着您的解决方案/解决方法是有效的。 – huhu78 2015-09-14 11:16:02

28

我投了nemesv答案,因为它给了我一个关于发生了什么事情的解释。我有MVC3和MVC4项目,这让我很生气。

但是我有另一种解决方案。重写初始化方法在控制类:

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 2013-12-10 16:25:21

+0

你的解决方案是一个伟大的方法阿方索。它正是ExecuteCore()的正确替代方案,并且可以与MVC5一起使用。这是控制器的MSDN文档。初始化方法:http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.initialize(v=vs.118).aspx – GDB 2013-12-19 02:27:48

+0

很高兴知道,但它不适合我因为我需要访问我的数据库上下文和一个会话变量,这些变量在Initialize被触发时尚未实例化。 BeginExecuteCore替我完成了这项工作。 – ZipionLive 2017-05-01 22:36:03

7

您还可以使用BeginExecuteCore

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

在MVC中很好地工作4.很好,很简单。 – 2014-10-30 01:47:26

+0

你刚刚为我节省了一天,谢谢! – ZipionLive 2017-05-01 22:33:46

相关问题