我已经进行了自定义访问检查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,我该怎么办呢?
答案 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作为错误参数。
尝试以这种方式更改代码:
希望这有帮助!
顺便说一句,你可以直接从动作过滤器返回你需要的ActionResult - 所以不是重定向到Error动作(我想使用Redirect或RedirectToAction),你只需返回内容(“访问被拒绝的消息就在这里”) )。其中任何一种都可以正常使用。