Model view controller ActionFilterAttribute:x27;取消';财产?

Model view controller ActionFilterAttribute:x27;取消';财产?,model-view-controller,overriding,renderaction,actionfilterattribute,Model View Controller,Overriding,Renderaction,Actionfilterattribute,ActionExecutingContext上的Cancel属性发生了什么?在使用ActionFilterAttribute时,如何中止渲染,或者是否有其他方法来剥除这只猫的皮肤 public override void OnActionExecuting(ActionExecutingContext filterContext) { if(!filterContext.HttpContext.User.Identity.IsAuthenticated) { retu

ActionExecutingContext上的Cancel属性发生了什么?在使用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 }); %>


当用户未通过身份验证时,此操作将不返回任何内容,我可以轻松地在视图上放置“如果”块,但是,我希望将规则保留在控制器中。

否,您不能从操作筛选器取消渲染。你不应该那样做有很多原因。客户会看到什么?错误页?什么都没有

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

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

--更新--


如果要使用render action,只需将逻辑放入控制器中,如果未登录,则返回空结果(框架中有一个名为“EmptyResult”的操作结果)。这种逻辑属于控制器动作。

这非常有效,Mattias结果如下:

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

马蒂亚斯和Rjamstrong已经回答了我们的问题。以下是过滤器和控制器的完整代码:

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

    ...
}

请参阅我的render action更新。但是控制器action方法中的代码仍在执行?OnActionExecuting发生在action方法执行之前: