RedirectToRouteResult如何工作?

Tch*_*uan 7 c#-4.0 asp.net-mvc-2

我目前正在使用RedirectToRouteResult如下:

public void OnAuthorization(AuthorizationContext filterContext)
{
    User user = filterContext.HttpContext.Session["user"] as User;
    if (user == null || user.Role != expectedRole)
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary {
                {"controller", _controller}, {"action", _action}
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码在我的CheckLoginAttribute课上.

我打算将它用作特定控制器操作的装饰器,例如:

[CheckLogin(RolesEnum.Member, "MyController", "MyAction")]
public JsonResult GetNews()
Run Code Online (Sandbox Code Playgroud)

所以基本上,我正在尝试将对GetNews()的调用短路,并在用户未登录时跳过执行操作.如果用户未登录,那么我希望它重定向到另一个操作.

RedirectToRouteResult重定向到相应的操作服务器端,而不必通过客户端进行大循环(如重写窗口URL位置或类似的东西)?它是如何工作的?

Tch*_*uan 4

嗯,我自己已经想出来了。

所以基本上,我需要的不是“重定向”。我正在寻找错误的地方来解决我的问题。我知道重定向意味着我必须进行多次客户端/服务器访问才能返回 json 结果,但感觉不太对劲。

我花了一段时间才意识到我可以将任何类型的结果传递到filterContext.Result中。

我的错。我没有问正确的问题,因为我没有完全理解我面临的问题。经过大量研究后,我们发现自己真的很愚蠢。

最终解决方案是:

    public class CheckLoginAttribute : AuthorizeAttribute, IAuthorizationFilter
{

    private RolesEnum expectedRole;

    public CheckLoginAttribute(RolesEnum role)
    {
        expectedRole = role;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        User user = filterContext.HttpContext.Session["user"] as User;
        if (user == null || user.Role != expectedRole)
        {
            filterContext.Result = new JsonResult()
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = new LoginMessage() { IsValidLogin = false }
            };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以用这个来装饰我的操作方法:

[CheckLogin(RolesEnum.Admin)]
Run Code Online (Sandbox Code Playgroud)

再编写一点代码来避免 ASP.NET 会话窃取,我就完成了。

我希望这能帮助那里的人。谢谢。