假设我们想要将旧版本的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错误。 问题出在哪儿?为什么我会收到此错误?
答案 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.您发布的原始代码很好。