asp.net mvc RedirectToRouteResult排除哈希值

时间:2015-08-11 15:04:47

标签: asp.net-mvc angularjs hash routing

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" }
            );

如果我打开这样的网址: 触发了http://localhost:52956/Home#/HomeActionHandleUnauthorizedRequest,然后网址结构如下所示:http://localhost:52956/Error%23/Error#/HomeAction

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

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

构建的

1 个答案:

答案 0 :(得分:0)

片段不是.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的片段部分发送回服务器(其中许多人不会),因此无法可靠地匹配它。您可以做的最好的事情是匹配没有片段的URL路径。

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

这假设您的应用中没有其他网址/Error,否则您将发生冲突。