В вашем случае sponsor
следует рассматривать не как постоянную часть URL, а как переменную часть.
В Global.asax:
public static void RegisterRoutes(RouteCollection routes)
{
...
routes.MapRoute(
"SponsorRoute",
"{sponsor}/{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"NonSponsorRoute",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional, sponsor=string.Empty }
);
...
}
В ваших контроллерах, например, HomeController.cs:
namespace YourWebApp.Controllers
{
public class HomeController : Controller
{
public ActionResult Index(string sponsor)
{
// Here you can do any pre-processing depending on sponsor value, including redirects etc.
}
...
}
}
Обратите внимание, что тип этого параметра всегда будет System.String
, а имя компонента шаблона маршрута {sponsor}
должно точно совпадать с именем параметра действия string sponsor
в ваших контроллерах.
UPD: добавлен второй маршрут для не спонсора.
Обратите внимание, что такая настройка усложнит вашу логику, поскольку вы можете перепутать разные URL, например, URL
http://www.example.com/a/b/c
может соответствовать обоим маршрутам: первый будет иметь спонсора = а, контроллера = b и действия = с; второй будет иметь контроллер = a, action = b и id = c.
Этой ситуации можно избежать, если указать более строгие требования к URL-адресам - например, вы можете захотеть, чтобы идентификаторы были только числовыми. Ограничения указаны в четвертом параметре функции routes.MapRoute()
.
Другим подходом для устранения неоднозначности является указание отдельных маршрутов для всех ваших контроллеров (обычно их не будет много в вашем приложении) перед общим маршрутом для спонсоров.
UPD:
Самый простой, но в то же время наименее обслуживаемый способ различения спонсорских и не спонсорских маршрутов - это указание маршрутов для конкретного контроллера, например:
public static void RegisterRoutes(RouteCollection routes)
{
...
routes.MapRoute(
"HomeRoute",
"Home/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional, sponsor=string.Empty }
);
routes.MapRoute(
"AccountRoute",
"Account/{action}/{id}", // URL with parameters
new { controller = "Account", action = "Index", id = UrlParameter.Optional, sponsor=string.Empty }
);
...
routes.MapRoute(
"SponsorRoute",
"{sponsor}/{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
...
}
Обратите внимание, что здесь все маршруты, относящиеся к контроллеру, должны быть добавлены до SponsorRoute.
Более сложным, но более чистым способом является реализация RouteConstraints для имен спонсоров и контроллеров, как описано в ответе @ counsellorben.