ActionFilterAttribute重定向到带参数的action方法

时间:2011-03-13 13:24:23

标签: c# asp.net-mvc-3

我已经进行了自定义访问检查ActionFilterAttribute,如果他们没有足够的访问权限我想重定向到错误页面。这是我到目前为止所拥有的。

RouteValueDictionary routeValues = new RouteValueDictionary(new {
                action = "Error",
                controller = "Home",
                error = new Error(HttpStatusCode.Unauthorized, "You do not have sufficient access to complete your request.", (HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : ""), DateTime.Now)
            });
            filterContext.Result = new RedirectToRouteResult(routeValues);

以下是错误页面操作方法

public ActionResult Error(Error error)

但是当路由重定向到action方法时,'error'参数为null,如果没有参数为null,我该怎么办呢?

2 个答案:

答案 0 :(得分:5)

重定向时无法传递复杂的对象参数。您可以传递它的组成属性,并让默认模型绑定器完成重构它的工作。假设你有以下型号:

public class Error
{
    public string Message { get; set; }
    public HttpStatusCode Status { get; set; }
    public string UserHost { get; set; }
    public DateTime Date { get; set; }
}

你可以像这样重定向:

var routeValues = new RouteValueDictionary(new 
{
    action = "Error",
    controller = "Home",

    Message = "You do not have sufficient access to complete your request.",
    Status = HttpStatusCode.Unauthorized,

    // Remark: never use HttpContext.Current :
    UserHost = filterContext.HttpContext.Request.UserHostAddress,

    Date = DateTime.Now.ToString("u")
});
filterContext.Result = new RedirectToRouteResult(routeValues);

另外,对于处理授权,我建议您编写自定义AuthorizeAttribute而不是自定义ActionFilterAttribute。它在语义上更正确。

答案 1 :(得分:1)

你的问题是由于这个原因引起的:当声明路由时(通常在global.asax(.cs)中),HttpContext.Current总是为空!因此,操作将始终收到null作为错误参数。

尝试以这种方式更改代码:

    global.asax(.cs)中的
  • 仅声明其中包含控制器和操作的路由。这对于路线来说已经足够了。
  • 在Home controller的Error()动作中,定义显示您需要的“拒绝访问”消息的代码(通常通过返回内容完成(“访问被拒绝的消息在这里”))。
  • 如果你的动作过滤器能够成功地重定向到这条路线,那么就应该保持原样。

希望这有帮助!

顺便说一句,你可以直接从动作过滤器返回你需要的ActionResult - 所以不是重定向到Error动作(我想使用Redirect或RedirectToAction),你只需返回内容(“访问被拒绝的消息就在这里”) )。

其中任何一种都可以正常使用。