我在ASP.NET MVC4项目中有以下路由配置:
routes.MapRoute(
name: "HttpError",
url: "{controller}/{id}",
defaults: new { controller = "Error", action = "Index" },
constraints: new { id = @"\d+" }
);
现在,我想知道如何创建生成指向RedirectResult
而不是RedirectToRouteResult
的网址的/Error/403
或/Error/Index/403
。
额外信息
我正在尝试将未经授权的用户从其重写方法System.Web.Mvc.AuthorizeAttribute
内的HandleUnauthorizedRequest(AuthorizationContext)
的自定义实现中重定向。
答案 0 :(得分:1)
重定向到路线允许您执行类似以下操作:
return RedirectToRoute("HttpError", new { controller = "Error", id = "401" }
应生成没有操作的链接。
答案 1 :(得分:1)
在你的情况下使用它:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{"action", "Index"},
{"controller", "Error"},
{"id", "403"},
});
}
您必须考虑到您的路线必须放在适当的位置 - 在更一般的路线之前,例如:
routes.MapRoute(
name: "HttpError",
routes.MapRoute(
name: "Default",
如果您撤消订单,MVC将获取适合的第一条路线,并将您重定向到例如/Error/Index/403
而不是/Error/403
。
答案 2 :(得分:0)
您需要像这样更改filterContext.Result(对于失败的授权)
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "SomeController", area = "MayBeSomeArea" }));
您应该在覆盖AuthorizeAttribute
答案 3 :(得分:0)
我认为这不是你想要的,但对我来说,只是返回这样的东西就足够了
return RedirectToRoute( new {controller = "controller_name",
action = "action_name"});