我有一个很简单的问题。
我只是想能够改变每一个URL,得到由一个帮助类在MVC创建。. NET,问题是我不知道我必须重写什么才能做到这一点。
编辑:我的目标是改变MVC的行为,当它创建url ..我想使MVC创建seo友好的url。
Google &我不比你聪明多少……
如果有人知道我要改变的地方,请给我一个提示,谢谢:)
掌握路由:
http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/asp-net-mvc-routing-overview-cs路由在全局路由中找到。asax文件和像ActionLink
这样的htmlhelper应该自动适应你的自定义路由。如果在默认路由之上指定一个自定义路由,然后执行以下操作,生成的URL将与路由匹配:
@Html.ActionLink("Go!", "AnAction", "AController")
如果您在路由中指定的其他参数不能作为ActionLink
标准过载的参数,则可以在routeValues
参数中传递这些参数:
@Html.ActionLink("Go!", "AnAction", "AController",
new { MyCustomParameter = "Hello" })
using System;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace yourbelovedNamespace
{
/// <summary>
/// Provides properties and methods for defining a seo friendly route
/// </summary>
public class SeoFriendlyRoute : Route
{
#region Constructors
public SeoFriendlyRoute(string url, IRouteHandler routeHandler)
: base(url, routeHandler)
{
}
public SeoFriendlyRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
: base(url, defaults, routeHandler)
{
}
public SeoFriendlyRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints,
IRouteHandler routeHandler)
: base(url, defaults, constraints, routeHandler)
{
}
public SeoFriendlyRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints,
RouteValueDictionary dataTokens, IRouteHandler routeHandler)
: base(url, defaults, constraints, dataTokens, routeHandler)
{
}
#endregion
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData data = base.GetRouteData(httpContext);
return data;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
var trimmedValues = new RouteValueDictionary();
foreach (var value in values)
{
if (value.Value != null && value.Key != "controller" && value.Key != "action")
trimmedValues.Add(value.Key, GenerateSeourl(value.Value.ToString()));
else
{
trimmedValues.Add(value.Key, value.Value != null ? value.Value.ToString() : value.Value);
}
}
VirtualPathData data = base.GetVirtualPath(requestContext, trimmedValues);
if (data != null)
data.VirtualPath = data.VirtualPath;
return data;
}
private static string GenerateSeourl(string url)
{
// make the url lowercase
var encodedUrl = (url ?? "");
encodedUrl = encodedUrl
.Replace("%20", "")
.Replace(" ", "")
.Replace("/", "-");
return encodedUrl;
}
}
public static class SeoFriendlyRouteCollectionExtensions
{
//Override for localized route
public static Route MapSeoFriendlyRoute(this RouteCollection routes, string name, string url, object defaults)
{
return routes.MapSeoFriendlyRoute(name, url, defaults, null, null);
}
public static Route MapSeoFriendlyRoute(this RouteCollection routes, string name, string url, object defaults,
object constraints)
{
return routes.MapSeoFriendlyRoute(name, url, defaults, constraints, null);
}
public static Route MapSeoFriendlyRoute(this RouteCollection routes, string name, string url, object defaults,
object constraints, string[] namespaces)
{
if (routes == null)
{
throw new ArgumentNullException("routes");
}
if (url == null)
{
throw new ArgumentNullException("url");
}
var item = new SeoFriendlyRoute(url, new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(defaults),
Constraints = new RouteValueDictionary(constraints),
DataTokens = new RouteValueDictionary()
};
if ((namespaces != null) && (namespaces.Length > 0))
{
item.DataTokens["Namespaces"] = namespaces;
}
routes.Add(name, item);
return item;
//return routes.MapSeoFriendlyRoute(name, urlPattern, defaults, null);
}
private static Route MapSeoFriendlyRoute(this AreaRegistrationContext context, string name, string url,
object defaults, object constraints, string[] namespaces)
{
if ((namespaces == null) && (context.Namespaces != null))
{
namespaces = context.Namespaces.ToArray();
}
Route route = context.Routes.MapSeoFriendlyRoute(name, url, defaults, constraints, namespaces);
route.DataTokens["area"] = context.AreaName;
bool flag = (namespaces == null) || (namespaces.Length == 0);
route.DataTokens["UseNamespaceFallback"] = flag;
return route;
}
public static Route MapSeoFriendlyRoute(this AreaRegistrationContext context, string name, string url,
object defaults, string[] namespaces)
{
return context.MapSeoFriendlyRoute(name, url, defaults, null, namespaces);
}
public static Route MapSeoFriendlyRoute(this AreaRegistrationContext context, string name, string url,
object defaults, object constraints)
{
return context.MapSeoFriendlyRoute(name, url, defaults, constraints, null);
}
public static Route MapSeoFriendlyRoute(this AreaRegistrationContext context, string name, string url,
string[] namespaces)
{
return context.MapSeoFriendlyRoute(name, url, null, namespaces);
}
public static Route MapSeoFriendlyRoute(this AreaRegistrationContext context, string name, string url,
object defaults)
{
return context.MapSeoFriendlyRoute(name, url, defaults, null);
}
public static Route MapSeoFriendlyRoute(this AreaRegistrationContext context, string name, string url)
{
return context.MapSeoFriendlyRoute(name, url, null);
}
}
}
这就是我解决问题的方法。它允许在区域和默认routecconfig中注册"SEO"路由。
修剪过程不是很成熟,但这只是为了演示。