Решение, которое подходит для вашего случая, но не рекомендуется
В вашем приложении есть предопределенный набор контроллеров (обычно меньше 10), поэтому вы можете наложить ограничение на имя контроллера и затем направить все остальное в профиль пользователя:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new { controller = "Home|Admin|Reports|..." }
);
routes.MapRoute(
"Profile",
"{username}/{action}",
new { controller = "Profile", action = "Details" }
);
Но это не будет работать, если какое-то имя пользователя совпадает с именем вашего контроллера. Это небольшая вероятность, основанная на опыте и эмпирических данных, но вероятность не равна 0%. Когда имя пользователя совпадает с именем какого-либо контроллера, это автоматически означает, что оно будет обработано первым маршрутом, потому что ограничения не подведут его.
Рекомендуемое решение
Лучше всего было бы иметь URL-запросы:
www.mydomain.com/profile/username
Почему я рекомендую так? Это сделает его намного проще и чище и позволит иметь несколько разных страниц профиля:
- подробности
www.mydomain.com/profile/username
- настройки
www.mydomain.com/profile/username/settings
- сообщения
www.mydomain.com/profile/username/messages
- и т.д.
Определение маршрута в этом случае будет выглядеть так:
routes.MapRoute(
"Profile",
"Profile/{username}/{action}",
new { controller = "Profile", action = "Details" }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);