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