我需要实现以下自定义操作过滤器:
操作过滤器,当应用于操作CountRows
时,应该在其中OnActionExecuting
处理“记住”之前调用的操作,并将客户端浏览器重定向到Login
操作例如。但是登录操作应该以某种方式知道被调用的原始操作,以便在登录完成后,它立即重定向回CountRows
。
我猜我可以在filterContext
的{{1}}中保存原始操作名称,但是如何实施该方案呢?
答案 0 :(得分:4)
您只需使用以下代码即可完成此操作:
[AttributeUsage(AttributeTargets.All)]
public class MyActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//write your logic
RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("area", "");
redirectTargetDictionary.Add("action", "Error");
redirectTargetDictionary.Add("controller", "Home");
filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
}
}
MyActionFilter 重定向到链接“〜/ Home / Error ”。
此示例是从链接复制的(为了答案而略微更改): http://www.c-sharpcorner.com/UploadFile/ff2f08/use-of-mvc-custom-action-filter/
答案 1 :(得分:0)
您不应该需要临时数据。理想情况下,您的SignIn GET操作应采用字符串returnUrl参数。然后你可以使用过滤器并将filterContext.HttpContext.Request.RawUrl传递给登录。让它将重定向URL写入登录表单中的隐藏字段。然后当他们POST时,执行auth,并返回Redirect(model.ReturnUrl)。
如果使用[Authorize]属性修饰受保护的操作,MVC实际上默认具有此行为。从技术上讲,它传递的是Request.Url.Path而不是RawUrl,但概念和结果是相同的。