mvc自定义路由配置

时间:2013-12-19 18:47:16

标签: asp.net-mvc routes asp.net-mvc-routing

假设我们想要将旧版本的asp.net Web表单转换为mvc架构。 但是有些用户已经为我们的网址添加了书签,或者他们已将其链接到其他网站上。 现在我们不想放弃那些urls.instead我们想要创建一个管理旧类型URL的自定义路由。 此类从用户获取旧URL并创建新路由并将用户重定向到新页面。 这是我的自定义路线类:

public class LegacyRoute:RouteBase
{
    private string[] urls;
    public LegacyRoute(params string[] targetUrls)
    {
        urls = targetUrls;
    }
    public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData result = null;
string requestedURL =
    httpContext.Request.AppRelativeCurrentExecutionFilePath;
        if (urls.Contains(requestedURL,StringComparer.OrdinalIgnoreCase))
        {
            result = new RouteData(this, new MvcRouteHandler());
            result.Values.Add("controller", "Legacy");
            result.Values.Add("action", "GetLegacyUrl");
            result.Values.Add("legacyUrl", requestedURL);
        }
        return result;
}
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        return null;
    }
}

这是我的RegisterRoutes函数:

 public static void RegisterRoutes(RouteCollection routes)
    {
       // routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.Add(new LegacyRoute("~/articles/windows_3.1_Overview.html", "~/old/.NET_1.0_Class_Library"));
        routes.MapRoute(null, "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });

    }

我还创建了“Legacy”控制器和“GetLegacyUrl”动作。 但是当我运行网站并输入

"localhost:14786/articles/windows_3.1_Overview.html" 

在我的浏览器中,我收到404 Not Found错误。 问题出在哪儿?为什么我会收到此错误?

2 个答案:

答案 0 :(得分:0)

我通过创建一个查看路径的全局属性解决了这个问题(在Restful Routing中),然后执行重定向,如果它意识到路由是“重定向路由”。在您的情况下,它将是 LegacyRoute

public class RedirectFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.IsChildAction)
            return;

        var redirect = filterContext.RouteData.Route as RedirectRoute;
        if (redirect != null)
        {
            var helper = new UrlHelper(filterContext.RequestContext);
            var values = new RouteValueDictionary(filterContext.RequestContext.RouteData.Values);
            var merged = new RouteValueDictionary(redirect.DataTokens["new_path"] as RouteValueDictionary);

            // keep the values we specified, and add the other routeValues
            // that we we didn't have overrides for.
            foreach (var key in values.Keys.Where(key => !merged.ContainsKey(key)))
                merged.Add(key, filterContext.RouteData.Values[key]);

            var url = helper.RouteUrl(filterContext.RouteData.Values);
            filterContext.Result = new RedirectResult(url, redirect.IsPermanent);
        }
    }
}

答案 1 :(得分:0)

我知道这就像一个月大,但在你的帖子中,你没有提到这个观点。您希望用户到达什么视图?控制器因GetLegacyUrl而返回的视图是什么?如果有GetLegacyUrl的视图被撤消,那么您将无法获得404.您发布的原始代码很好。