ActionExecutingContext上的Cancel属性发生了什么?在使用ActionFilterAttribute时如何中止RenderAction,或者是否有其他方法来剥掉这只猫?
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 }); %>当用户未通过身份验证时,此操作不应返回任何内容,我可以很容易地在视图上放置一个'if‘块,但是,我希望将规则保留在控制器中。
发布于 2010-01-26 12:13:07
不,不能取消动作筛选器的呈现。你不应该那样做有很多原因。客户会看到什么?错误页面?没什么?
我猜您正在构建一个授权操作筛选器,如果您没有登录,它将呈现其他内容。如果没有登录,框架中已经有一个(AuthorizeAttribute)将您重定向到登录页面。他们在框架中的方法是更改正在执行的结果(filterContext.Result =[新结果];)。如果您不喜欢它的工作方式,您可以构建自己的实现。
如果仍然需要取消呈现或类似的操作,则需要构建自己的ActionResult,并在执行方法中执行所需的任何逻辑。
--更新--
如果您想使用render操作,您应该将逻辑放在控制器中,如果没有登录,则返回空结果(框架中有一个称为"EmptyResult“的操作结果)。这种逻辑属于控制器动作。
发布于 2010-01-26 16:31:26
这起作用很大,马蒂亚斯的结果是:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new EmptyResult();
return;
}
base.OnActionExecuting(filterContext);
}发布于 2016-03-17 12:47:52
马蒂亚斯和雷姆斯特朗已经有了一个更好的问题。下面是过滤器和控制器的完整代码:
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();
}
...
}https://stackoverflow.com/questions/2139122
复制相似问题