ActionFilterAttribute: Где находится свойство «Отмена»?

Что случилось со свойством 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 }); %>

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


person rjarmstrong    schedule 26.01.2010    source источник
comment
Смотрите мое обновление по действию рендеринга.   -  person Mattias Jakobsson    schedule 26.01.2010


Ответы (3)


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

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

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

-- Обновить--

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

person Mattias Jakobsson    schedule 26.01.2010

Это отлично сработало, Маттиас, результат таков:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new EmptyResult();
            return;
        }
        base.OnActionExecuting(filterContext);
    }
person rjarmstrong    schedule 26.01.2010
comment
но код внутри метода действия контроллера все еще выполняется? - person Alex from Jitbit; 10.09.2014
comment
OnActionExecuting происходит перед выполнением метода действия: msdn.microsoft.com/en-us/library/ - person rjarmstrong; 11.09.2014

Маттиас и Рьярмстронг уже ответили на вопрос. Вот полный код фильтра и контроллера:

public class CancelFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //before execution
        var id = filterContext.RequestContext.HttpContext.Request.Params["id"];
        if (id == "0")
        {
            filterContext.Result = new EmptyResult();
            return;
        }
        base.OnActionExecuting(filterContext);
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        //after execution
    }
}


[CancelFilter]
public class HomeController : Controller
{
    public ActionResult DoSome(string id)
    {
        return View();
    }

    ...
}
person Alexey Obukhov    schedule 17.03.2016