Как убедиться, что определенная общая логика запускается раньше всего в веб-приложении MVC? - PullRequest
0 голосов
/ 06 сентября 2011

В настоящее время у меня есть частичное представление, которое вызывается в моем _Layout.cshtml и отображается во всем моем веб-приложении MVC. Это первый элемент в верхней части страницы, который должен быть визуализирован, и в рамках метода ActionResult, который отвечает за него, у меня есть вызов к моей службе для выполнения некоторой бизнес-логики.

Первоначально этот сервисный вызов я поместил в этот конкретный метод ActionResult, поскольку, еще будучи новичком в MVC, у меня было ложное впечатление, что он будет запущен ДО любого содержимого главной страницы для каждой страницы сайта. Однако я только что понял, что метод основного вида вызывается первым, а потом вызывается этот метод ChildActionOnly (для частичного представления).

По сути, важно, чтобы вызов бизнес-логики, который я в данный момент выполняю в методе ChildActionOnly (связан с моим частичным представлением), выполнялся ПЕРЕД любой другой обработкой страницы (поскольку мне нужно выполнять некоторые обновления БД при каждой загрузке страницы). , которые затем отражаются на каждой запрашиваемой странице).

Я рад отделить эту бизнес-логику от текущего метода действия частичных представлений, но не уверен, куда он должен идти или как я должен быть уверен, что он вызывается раньше всего для каждого запроса страницы? Какой будет норма подхода?

Ответы [ 3 ]

1 голос
/ 06 сентября 2011

Вам нужен глобальный фильтр действий (к счастью, начиная с MVC3).

Смотрите пример здесь:

http://weblogs.asp.net/gunnarpeipman/archive/2010/08/15/asp-net-mvc-3-global-action-filters.aspx

Копирование с образца (с небольшими изменениями):

public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext context)
    {
        // Your logic can come here 

        base.OnResultExecuting(filterContext);

        // Your logic can come here 
    }
}

Подача заявки в global.asax.cs (из статьи):

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    // Register global filter
    GlobalFilters.Filters.Add(new MyActionFilterAttribute());

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}
1 голос
/ 06 сентября 2011

Как насчет переопределения метода OnResultExecuting ваших контроллеров? Если у вас есть базовый класс контроллера, сделайте это там - в противном случае inject получит новый класс Controller и заставит все ваши существующие контроллеры наследовать его (в любом случае, это хорошая практика).

public class MyControllerBase : Controller
{
  protected override void OnResultExecuting(ResultExecutingContext filterContext)
  {
    //filterContext contains the Result (e.g. ViewResult) plus route data etc.
    //you can also analyse Model and ViewData in here too.
  }
} 
0 голосов
/ 06 сентября 2011

То, что вы описываете, звучит как аспект вашего приложения. Для этого MVC имеет функцию под названием Фильтры действий .

Вы можете реализовать атрибут ActionFilterAttribute следующим образом:

public class LogActionAttribute : ActionFilterAttribute
{
    private ILog _log = new SomeLogger();

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var type = filterContext.Controller.GetType();
        _log.Debug("Executing action '{0}' on controller '{1}'", filterContext.ActionDescriptor.ActionName, type.Name);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var type = filterContext.Controller.GetType();
        _log.Debug("Executed action '{0}' on controller '{1}'", filterContext.ActionDescriptor.ActionName, type.Name);
    }
}

Вы можете применить это к тем действиям, которые вы хотите, или к так называемым « фильтрам глобальных действий », если вы хотите, чтобы они применялись ко всем действиям.

Подробнее о фильтрах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...