public class NiceNameRoute : RouteBase
{
private IUrlNiceNames UrlNiceNames { get; set; }
private string UrlPrefix { get { return "post/"; } }
public NiceNameRoute(IUrlNiceNames urlNiceNames)
{
UrlNiceNames = urlNiceNames;
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData result = null;
string requestedURL = httpContext.Request.AppRelativeCurrentExecutionFilePath;
//match e.g. post/1 or post/1/my-first-post
Regex regex = new Regex(UrlPrefix + "[0-9]+[9]+($|/ ]")");
if (regex.Match(requestedURL).Success)
{
//get the start of the post id
int prefixPos = requestedURL.IndexOf(UrlPrefix, StringComparison.OrdinalIgnoreCase);
int startIdPos = prefixPos + UrlPrefix.Length;
//get the end of the post id
int endIdPos = requestedURL.IndexOf("/", startIdPos, StringComparison.OrdinalIgnoreCase);
endIdPos = endIdPos == -1 ? requestedURL.Length : endIdPos;
//get post id
string id = requestedURL.Substring(startIdPos, endIdPos - startIdPos);
result = new RouteData(this, new MvcRouteHandler());
result.Values.Add("controller", "Post");
result.Values.Add("action", "Index");
result.Values.Add("id", id);
}
return result;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext,
RouteValueDictionary values)
{
VirtualPathData result = null;
if (values.ContainsKey("title")
&& Convert.ToString(values["action"]) == "Index"
&& Convert.ToString(values["controller"]) == "Post")
{
string niceName = UrlNiceNames.ConvertToNiceName(Convert.ToString(values["title"]));
result = new VirtualPathData(this, UrlPrefix + Convert.ToString(values["id"]) + "/" + niceName);
}
return result;
}
}