Один из способов сделать это - создать отдельный маршрут для каждой целевой страницы. Другой способ - создать один маршрут с ограничением, соответствующим каждой целевой странице (и ничем иным).
routes.MapRoute(
"LandingPage1"
"landingpage1/{id}",
new { controller = "home", action = "landingpage", id = UrlParameter.Optional } );
routes.MapRoute(
"LandingPage2"
"landingpage2/{id}",
new { controller = "home", action = "landingpage2", id = UrlParameter.Optional } );
Обратите внимание, что вы, вероятно, могли бы сделать это и с небольшим количеством размышлений (не проверено).
foreach (var method on typeof(HomeController).GetMethods())
{
if (method.ReturnType.IsInstanceOf(typeof(ActionResult)))
{
routes.MapRoute(
method.Name,
method.Name + "/{id}",
new { controller = "home", action = method.Name, id = UrlParameter.Optional } );
}
}
Решение RouteConstraint будет аналогичным, за исключением того, что у вас будет один маршрут с настраиваемым ограничением, который оценивает, соответствует ли соответствующее значение маршрута одному из методов HomeController, и, если так, заменяет контроллер и действие на «home "и соответствующее значение.
routes.MapRoute(
"LandingPage",
"{action}/{id}",
new { controller = "home", action = "index", id = UrlParameter.Optional },
new LandingPageRouteConstraint()
);
public LandingPageRouteContstraint : IRouteConstraint
{
public bool Match
(
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
{
// simplistic, you'd also likely need to check that it has the correct return
// type, ...
return typeof(HomeController).GetMethod( values.Values["action"] ) != null;
}
}
Обратите внимание, что механизм маршрутизации на страницу, даже если вы используете отражение, выполняется только один раз. С этого момента вы каждый раз делаете простой поиск. Механизм RouteConstraint будет использовать отражение каждый раз, чтобы увидеть, совпадает ли маршрут (если он не кэширует результаты, что я не думаю, что он делает).