ActionFilterAttribute: Где свойство 'Cancel'?

Что бы ни случилось к свойству Cancel на ActionExecutingContext? Как можно было бы прервать RenderAction при использовании ActionFilterAttribute, или там другой путь состоит в том, чтобы освежевать эту кошку?

  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
   if(!filterContext.HttpContext.User.Identity.IsAuthenticated)
   {
    return;
   }
   base.OnActionExecuting(filterContext);
  }

Код выше продолжает выполнять Действие, к этому относились несмотря на выход из деятельности OnActionExecuting?

---В дополнение к исходному сообщению: Спасибо за ответы ниже, однако, я не думаю, что сделал контекст достаточно ясным, я пытаюсь делать недействительным следующий вызов:

<% Html.RenderAction("Menu", "Shared", new { id = Model.OtherUserId }); %>

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

7
задан rjarmstrong 26 January 2010 в 12:23
поделиться

2 ответа

На основе версии от antonylesuisse, рабочая версия (на python > = 2.6).

# -*- coding: utf8 -*-
import xmlrpclib
import httplib
import socket

class TimeoutHTTP(httplib.HTTP):
   def __init__(self, host='', port=None, strict=None,
                timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
        if port == 0:
            port = None
        self._setup(self._connection_class(host, port, strict, timeout))

class TimeoutTransport(xmlrpclib.Transport):
    def __init__(self, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *args, **kwargs):
        xmlrpclib.Transport.__init__(self, *args, **kwargs)
        self.timeout = timeout

    def make_connection(self, host):
        host, extra_headers, x509 = self.get_host_info(host)
        conn = TimeoutHTTP(host, timeout=self.timeout)
        return conn

class TimeoutServerProxy(xmlrpclib.ServerProxy):
    def __init__(self, uri, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
                 *args, **kwargs):
        kwargs['transport'] = TimeoutTransport(timeout=timeout,
                                    use_datetime=kwargs.get('use_datetime', 0))
        xmlrpclib.ServerProxy.__init__(self, uri, *args, **kwargs)
-121--2130661-

Обобщил и расширил мои комментарии ниже вопроса здесь

Как и другие сказали, это не Фабрика , просто потому, что образец с таким названием не существует. Это либо абстрактная фабрика , либо Метод фабрики , хотя прагматично люди часто ссылаются на или просто говоря фабрика и это нормально для меня.

Сеанс, кэш и БД, как правило, инициализируются на ранних этапах процесса работы приложения, поэтому в основном это работа bootstrap. У меня складывается впечатление, что вы ищете не столько создание объектов, сколько их обработку по всему приложению. Это несколько отличается от того, что делает FactiveWhather .

Как я сказал в комментариях, только потому, что это не совсем FactiveWhather , не означает, что ваш код плохой. Если это решит вашу проблему, это круто. Но я все еще думаю, что то, что вы пытаетесь сделать, например, создание и управление ресурсами во время выполнения, лучше всего использовать с DI Сервис Контейнер .

Если вы не хотите использовать контейнер DI сейчас для этого, вы можете просмотреть Zend _ Приложение и то, как они загружают ресурсы . Это альтернатива и оставляет возможность добавить контейнеры DI позже.

На самом деле, в Zend Framework уже решены многие темы предыдущих вопросов, например, классы Config. Я не говорю использовать ZF, но вы можете проверить, как они делают вещи. Конечно, можно также посмотреть на другие рамки .

Некоторые сайты образца с примерами PHP:

-121--3595005-

Нет, нельзя отменить визуализацию из фильтра действий. Есть много причин, по которым не стоит этого делать. Что увидит клиент? Страница ошибки? Ничего?

Я думаю, что вы создаете фильтр действий авторизации, который приведет к чему-то другому, если вы не войдете. В рамке уже есть (Атрибут входа), который перенаправляет вас на страницу входа, если вы не вошли. Способ выполнения этих действий в рамке заключается в изменении выполняемого результата (filterContext.Result = [[новый результат]];). Если вам не нравится, как это работает, вы можете построить свою собственную реализацию.

Если вам все еще нужно отменить рендеринг или что-то подобное, вам потребуется создать собственный ActionResult и выполнить любую необходимую логику в методе Execute.

-- Обновление --

Если вы хотите использовать действие визуализации, вы должны просто поместить логику в контроллер и вернуть пустой результат, если вы не вошли в систему (в рамке есть результат действия под названием «EmpureResult»). Такая логика принадлежит действию контроллера.

3
ответ дан 6 December 2019 в 11:49
поделиться

Это сработало великолепные маты, в результате это:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new EmptyResult();
            return;
        }
        base.OnActionExecuting(filterContext);
    }
14
ответ дан 6 December 2019 в 11:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: