Cześć, niedawno skonfigurowałem nowy routing SEO wedle pewnego pomysłu, który jest łątwy do zaimplementowania. Chodzi o generowanie ID przyjaznego dla użytkownika czyli np. 34-moj-przyjazny-link. Problem pojawił się, gdy chciałem ponownie go użyć, tym razem w nowej Area. Próbowałem wielu konfiguracji i nie widzę, gdzie leży problem.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("Show", new SeoRoute("Home/Read/{id}",
new RouteValueDictionary(new { controller = "Home", action = "Read" }),
new MvcRouteHandler()));
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "Projekt.Controllers" }
);
}
public class SeoRoute : Route
{
public SeoRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler) : base(url, defaults, routeHandler)
{
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var routeData = base.GetRouteData(httpContext);
if (routeData != null)
{
if (routeData.Values.ContainsKey("id"))
routeData.Values["id"] = GetIdValue(routeData.Values["id"]);
}
return routeData;
}
private object GetIdValue(object id)
{
if (id != null)
{
string idValue = id.ToString();
var regex = new Regex(@"^(?<id>\d+).*$");
var match = regex.Match(idValue);
if (match.Success)
{
return match.Groups["id"].Value;
}
}
return id;
}
}
Więc wedle powyższego wzorce definiuje route w ten sposób
routes.Add("Product", new SeoRoute("Customer/Home/Show/{id}",
new RouteValueDictionary(new { controller = "Home", action = "Show" }),
new MvcRouteHandler()));
public ActionResult Show(int id)
{
}
I jak wspomniałem wyżej, wywala mi błąd, że metoda id nie dostaje zdefiniowanego parametru. Sama metoda do generowania ID działa bez problemu.