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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

    ...
}
Другие вопросы по тегам