controller - tpt - ExecuteCore() en la clase base no activada en MVC 4 beta
query in asp net mvc (3)
Pude reproducir tu problema. Parece que el uso de ExecuteCore
ha cambiado. Pero no he encontrado ninguna información al respecto. Supongo que está relacionado con el hecho de que ahora el Controller
implementa IAsyncController
no AsyncController
.
Sin embargo, he encontrado una solución para obtener el antiguo comportamiento con MVC4:
Agregue esto a BaseContoller
:
protected override bool DisableAsyncSupport
{
get { return true; }
}
Desde la página de MSDN para DisableAsyncSupport (énfasis agregado por mí):
Esta bandera es para compatibilidad con versiones anteriores . ASP.NET MVC 4. permite que un controlador admita patrones asíncronos. Esto significa que
ExecuteCore
no recibe llamadas en las clases derivadas. Las clases derivadas pueden anular esta bandera y establecerse entrue
si aún necesitan que seExecuteCore
aExecuteCore
.
Tengo una clase de controlador base:
Y todo mi otro controlador hereda este BaseClass como este
Todo esto funciona muy bien en MVC3 (prueba nuevamente hoy, realmente funciona) pero parece que ExecuteCore en BaseController ya no se activa en MVC 4 beta.
¿Alguna idea? ¿O algo enorme ha cambiado bajo el capó? Muchas gracias.
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();
}
}
También puedes usar BeginExecuteCore
protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
return base.BeginExecuteCore(callback, state);
}
Voté una respuesta nemesv porque me dio una explicación sobre lo que está sucediendo. Tengo proyectos MVC3 y MVC4 y esto me estaba volviendo loco.
Sin embargo, tengo otra solución. Anular el método de inicialización en la clase de controlador:
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);
}
}
Luego, en su proyecto simplemente haga que sus controladores hereden de BaseController y eso es todo, la llamada BaseController funciona automáticamente pasando el contexto de la solicitud. Funciona tanto para MVC3 como para MVC4.