【问题标题】:Redirect to customized view via custom Action Filter in ASP.NET MVC通过 ASP.NET MVC 中的自定义操作筛选器重定向到自定义视图
【发布时间】:2012-05-15 22:02:26
【问题描述】:
我需要实现以下自定义操作过滤器:
动作过滤器,当应用于动作CountRows时,应该在它的OnActionExecutinghander中“记住”它之前被调用的动作,并将客户端浏览器重定向到Login动作。但是登录动作应该以某种方式知道被调用的原始动作,以便在登录完成后,它会立即重定向回CountRows。
我猜我可以将原始动作名称保存在filterContext 的TempData 中,但我一般如何实现该场景?
【问题讨论】:
标签:
c#
asp.net
asp.net-mvc
action-filter
【解决方案1】:
您可以使用以下代码简单地做到这一点:
[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/
【解决方案2】:
您不应该需要临时数据。理想情况下,您的 SignIn GET 操作应采用字符串 returnUrl 参数。然后您可以使用过滤器并将 filterContext.HttpContext.Request.RawUrl 传递给登录。让它将重定向 URL 写入登录表单中的隐藏字段。然后当他们 POST 时,进行身份验证,并返回一个 Redirect(model.ReturnUrl)。
如果您使用 [Authorize] 属性装饰受保护的操作,MVC 默认情况下实际上具有此行为。从技术上讲,它传递的是 Request.Url.Path 而不是 RawUrl,但概念和结果是相同的。