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