ActionFilterAttribute: где находится свойство «Отмена»? - PullRequest
7 голосов
/ 26 января 2010

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

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

Ответы [ 3 ]

14 голосов
/ 26 января 2010

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

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new EmptyResult();
            return;
        }
        base.OnActionExecuting(filterContext);
    }
3 голосов
/ 26 января 2010

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

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

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

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

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

0 голосов
/ 17 марта 2016

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

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();
    }

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