我需要实现以下自定义操作过滤器:
动作过滤器,当应用于一个动作时CountRows
,应该在它的处理程序中OnActionExecuting
“记住”它之前被调用的动作,并将客户端浏览器重定向到一个Login
动作。但是登录动作应该以某种方式知道被调用的原始动作,以便在登录完成后,它会立即重定向回CountRows
.
我猜我可以将原始动作名称 name 保存在filterContext
'sTempData
中,但是我一般如何实现该场景?
我需要实现以下自定义操作过滤器:
动作过滤器,当应用于一个动作时CountRows
,应该在它的处理程序中OnActionExecuting
“记住”它之前被调用的动作,并将客户端浏览器重定向到一个Login
动作。但是登录动作应该以某种方式知道被调用的原始动作,以便在登录完成后,它会立即重定向回CountRows
.
我猜我可以将原始动作名称 name 保存在filterContext
'sTempData
中,但是我一般如何实现该场景?
您可以使用以下代码简单地执行此操作:
[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/
你不应该需要临时数据。理想情况下,您的 SignIn GET 操作应采用字符串 returnUrl 参数。然后您可以使用过滤器并将 filterContext.HttpContext.Request.RawUrl 传递给登录。让它将重定向 URL 写入登录表单中的隐藏字段。然后当他们 POST 时,进行身份验证,并返回一个 Redirect(model.ReturnUrl)。
如果您使用 [Authorize] 属性装饰受保护的操作,则 MVC 实际上默认具有此行为。从技术上讲,它通过 Request.Url.Path 而不是 RawUrl,但概念和结果是相同的。