3

我需要实现以下自定义操作过滤器:

动作过滤器,当应用于一个动作时CountRows,应该在它的处理程序中OnActionExecuting“记住”它之前被调用的动作,并将客户端浏览器重定向到一个Login动作。但是登录动作应该以某种方式知道被调用的原始动作,以便在登录完成后,它会立即重定向回CountRows.

我猜我可以将原始动作名称 name 保存在filterContext'sTempData中,但是我一般如何实现该场景?

4

2 回答 2

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/

于 2012-11-26T20:07:05.993 回答
0

你不应该需要临时数据。理想情况下,您的 SignIn GET 操作应采用字符串 returnUrl 参数。然后您可以使用过滤器并将 filterContext.HttpContext.Request.RawUrl 传递给登录。让它将重定向 URL 写入登录表单中的隐藏字段。然后当他们 POST 时,进行身份验证,并返回一个 Redirect(model.ReturnUrl)。

如果您使用 [Authorize] 属性装饰受保护的操作,则 MVC 实际上默认具有此行为。从技术上讲,它通过 Request.Url.Path 而不是 RawUrl,但概念和结果是相同的。

于 2012-05-15T23:01:20.043 回答