ActionFilterAttribute:'Cancel'属性在哪里?

rja*_*ong 7 model-view-controller overriding renderaction actionfilterattribute

无论ActionExecutingContext上的Cancel属性发生了什么?如何在使用ActionFilterAttribute时中止RenderAction,还是有另一种方法可以对这只猫进行换肤?

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

尽管退出OnActionExecuting操作,上面的代码仍继续执行已应用的Action?

---进一步原帖: 感谢下面的答案,但是,我认为我的上下文不够清楚,我试图使以下调用无效:

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

当用户未经过身份验证时,此操作应该不返回任何内容,我可以轻松地在视图上放置"if"块,但是,我想将规则保留在控制器中.

rja*_*ong 14

这很有效,Mattias的结果如下:

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


Mat*_*son 3

不,您无法取消动作过滤器的渲染。有很多原因表明您不应该这样做。客户会看到什么?错误页面?没有什么?

我猜你正在构建一个授权操作过滤器,如果你没有登录,它会呈现其他内容。框架中已经有一个(AuthorizeAttribute),如果你没有登录,它会将你重定向到登录页面。他们的方式它在框架中的作用是更改正在执行的结果(filterContext.Result = [[new result]];)。如果您不喜欢它的工作方式,您可以构建自己的实现。

如果您仍然需要取消渲染或类似的操作,您将需要构建自己的 ActionResult 并在 Execute 方法中执行您需要的任何逻辑。

- 更新 -

如果您想使用渲染操作,您应该将逻辑放入控制器中,如果您未登录,则返回空结果(框架中有一个名为“EmptyResult”的操作结果)。这种逻辑属于控制器操作。