我有一段时间需要在我的asp.net mvc项目中支持以下网址。
http://www.example.com/d.aspx?did=1234
我需要将此映射到此网址。
http://www.example.com/Dispute/Detail/1234
我已经查看了以下信息。
http://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx
ASP.Net MVC routing legacy URLs passing querystring Ids to controller actions
在试图遵循这一点时,我可以获得第一个工作网址,但之后所有其他网址都被破坏了。 谁能看到我出错的地方?
这是我的路线。
public static void RegisterRoutes(RouteCollection routes)
{
// all my other routes
// Legacy routes
routes.Add(
"Legacy",
new LegacyRoute(
"d.aspx",
"LegacyDirectDispute",
new LegacyRouteHandler())
);
routes.MapRoute(
"LegacyDirectDispute",
"Dispute/Details/{id}",
new { controller = "Dispute", action = "Details", id = "" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
这是我正在使用的global.asax.cs中的代码。
public class LegacyRoute : Route
{
public string RedirectActionName { get; set; }
public LegacyRoute(string url, string redirectActionName, IRouteHandler routeHandler)
: base(url, routeHandler)
{
RedirectActionName = redirectActionName;
}
}
// The legacy route handler, used for getting the HttpHandler for the request
public class LegacyRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new LegacyHandler(requestContext);
}
}
// The legacy HttpHandler that handles the request
public class LegacyHandler : MvcHandler
{
private RequestContext requestContext;
public LegacyHandler(RequestContext requestContext)
: base(requestContext)
{
this.requestContext = requestContext;
}
protected override void ProcessRequest(HttpContextBase httpContext)
{
string redirectActionName = ((LegacyRoute)RequestContext.RouteData.Route).RedirectActionName;
var queryString = requestContext.HttpContext.Request.QueryString;
foreach (var key in queryString.AllKeys)
{
if (key.Equals("did"))
{
requestContext.RouteData.Values.Add("id", queryString["did"]);
}
else
{
requestContext.RouteData.Values.Add(key, queryString[key]);
}
}
VirtualPathData path = RouteTable.Routes.GetVirtualPath(requestContext, redirectActionName,
requestContext.RouteData.Values);
if (path != null)
{
httpContext.Response.Status = "301 Moved Permanently";
httpContext.Response.AppendHeader("Location", path.VirtualPath);
}
}
}
答案 0 :(得分:4)
您可以在站点根目录中创建一个名为d.aspx的文件,其内容类似于以下内容:
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
Response.Redirect(string.Format("http://{0}/Dispute/Detail/{1}", Request.Url.Host, Request.QueryString.Get("did")));
}
</script>
答案 1 :(得分:2)
以下是我最终解决问题的方法,直到我看到@grenade发布的简单答案为止。我在这里发现了这种技术http://www.mikesdotnetting.com/Article/108/Handling-Legacy-URLs-with-ASP.NET-MVC。
public class LegacyUrlRoute : RouteBase
{
public override RouteData GetRouteData(HttpContextBase httpContext)
{
const string status = "301 Moved Permanently";
var request = httpContext.Request;
var response = httpContext.Response;
var legacyUrl = request.Url.ToString();
var newUrl = "";
var id = request.QueryString.Count != 0 ? request.QueryString[0] : "";
if (legacyUrl.Contains("d.aspx"))
{
newUrl = "Dispute/Details/" + id;
response.Status = status;
response.RedirectLocation = newUrl;
response.End();
}
return null;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext,
RouteValueDictionary values)
{
return null;
}
}
public static void RegisterRoutes(RouteCollection routes)
{
// all my other routes
routes.Add(new LegacyUrlRoute());
}
答案 2 :(得分:0)
如何添加地图页面路线:
Routes.MapPageRoute(
"Legacy", // Route name
"d.aspx", // URL
"~/pathfromBaseUrl/d.aspx" // File
);
然后在你的aspx / view中使用它
Html.RouteLink("MyLinkName", "Legacy")