ExecuteCore () в базовом классе не запускается в бета-версии MVC 4 - PullRequest
26 голосов
/ 04 марта 2012

У меня есть базовый класс контроллеров:

И все мои другие контроллеры наследуют этот BaseClass, как этот

Все это прекрасно работает в MVC3 (протестируйте сегодня, оно действительно работает), но, кажетсячто ExecuteCore в BaseController больше не запускается в бета-версии 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();
    }
}

Ответы [ 3 ]

28 голосов
/ 15 апреля 2012

Я проголосовал за ответ nemesv, потому что он дал мне объяснение о том, что происходит.У меня есть проекты MVC3 и MVC4, и это меня бесит.

Однако у меня есть другое решение.Переопределите метод Initialize в классе Controller:

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.

28 голосов
/ 04 марта 2012

Мне удалось воспроизвести вашу проблему.Кажется, что использование ExecuteCore изменилось.Но я не нашел никакой информации об этом.Полагаю, это связано с тем, что теперь Controller реализует IAsyncController, а не AsyncController.

Однако я нашел обходной путь для получения старого поведения с MVC4:

Добавьте это на BaseContoller:

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

На странице MSDN для DisableAsyncSupport (выделено мной):

Этот флаг для обратной совместимости .ASP.NET MVC 4. позволяет контроллеру поддерживать асинхронные шаблоны.Это означает, что ExecuteCore не вызывается для производных классов. Производные классы могут переопределить этот флаг и установить значение true, если им по-прежнему требуется ExecuteCore для вызова.

7 голосов
/ 19 сентября 2013

Вы также можете использовать BeginExecuteCore

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
    return base.BeginExecuteCore(callback, state);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...