首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionFilterAttribute:“取消”属性在哪里?

ActionFilterAttribute:“取消”属性在哪里?
EN

Stack Overflow用户
提问于 2010-01-26 11:48:37
回答 3查看 5K关注 0票数 7

ActionExecutingContext上的Cancel属性发生了什么?在使用ActionFilterAttribute时如何中止RenderAction,或者是否有其他方法来剥掉这只猫?

代码语言:javascript
复制
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
   if(!filterContext.HttpContext.User.Identity.IsAuthenticated)
   {
    return;
   }
   base.OnActionExecuting(filterContext);
  }

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

代码语言:javascript
复制
<% Html.RenderAction("Menu", "Shared", new { id = Model.OtherUserId }); %>

当用户未通过身份验证时,此操作不应返回任何内容,我可以很容易地在视图上放置一个'if‘块,但是,我希望将规则保留在控制器中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-26 12:13:07

不,不能取消动作筛选器的呈现。你不应该那样做有很多原因。客户会看到什么?错误页面?没什么?

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

如果仍然需要取消呈现或类似的操作,则需要构建自己的ActionResult,并在执行方法中执行所需的任何逻辑。

--更新--

如果您想使用render操作,您应该将逻辑放在控制器中,如果没有登录,则返回空结果(框架中有一个称为"EmptyResult“的操作结果)。这种逻辑属于控制器动作。

票数 3
EN

Stack Overflow用户

发布于 2010-01-26 16:31:26

这起作用很大,马蒂亚斯的结果是:

代码语言:javascript
复制
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new EmptyResult();
            return;
        }
        base.OnActionExecuting(filterContext);
    }
票数 14
EN

Stack Overflow用户

发布于 2016-03-17 12:47:52

马蒂亚斯和雷姆斯特朗已经有了一个更好的问题。下面是过滤器和控制器的完整代码:

代码语言:javascript
复制
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();
    }

    ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2139122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档