[asp.net-mvc]asp.net mvc RedirectToRouteResult 排除哈希值

发布时间: 2017/3/25 1:48:20
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
public class AuthorizeUserAttribute : AuthorizeAttribute
{   
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
            "Error",            
            new RouteValueDictionary(
                        new
                        {
                            controller = "Error",
                            action = "Index"
                        })
                    );
    }
}

RouteConfig 在我添加新的路由︰

routes.MapRoute(
                name: "Error",
                url: "Error#/Error",
                defaults: new { controller = "Error", action = "Index" }
            );

如果我像这样打开 url: http://localhost:52956 / 家 #/ HomeActionHandleUnauthorizedRequest 触发,然后 url 结构看起来像这样︰ http://localhost:52956/Error%23/Error#/HomeAction

如何重定向到http://localhost:52956 / 错误 #/ 错误

PS 是生成应用程序,使用 angularJS 和 asp.net mvc

解决方法 1:

fragments不是.NET 路由的一部分,他们只使用应用 UrlHelper (这是什么驱动器 ActionLink 和 RouteLink)。所以,你可以通过使用 UrlHelper

filterContext.Result = new RedirectResult(
    UrlHelper.GenerateUrl(
        routeName: "Error", 
        actionName: "Index", 
        controllerName: "Error", 
        protocol: null, 
        hostName: null, 
        fragment: "/Error", 
        routeValues: null, 
        routeCollection: null, 
        requestContext: filterContext.RequestContext, 
        includeImplicitMvcValues: false));

或者,您可以显式指定的 URL。

filterContext.Result = new RedirectResult("/Error#/Error");

但无论哪种方式,您需要先修复你的路线。浏览器不需要回发到服务器发送 URL 的fragment部分 (和他们很多人没有),所以是不能可靠地与之相匹配。你可以做的最好是匹配fragment没有 URL 的路径。

routes.MapRoute(
    name: "Error",
    url: "Error",
    defaults: new { controller = "Error", action = "Index" }
);

这假设没有其他 URL 在您的应用程序 /Error ,否则你将会有冲突。

赞助商