Я думаю, что вам нужно сделать два маршрута.
routes.MapRoute("UserName", // Route name
"User/UserProfile/{UserNameId}", // URL with parameters
new { controller = "User",
action = "UserProfile"
);
routes.MapRoute("UserName", // Route name
"User/UserProfile/{UserName}/{UserId}", // URL with parameters
new { controller = "User", action = "UserProfile"
);
Затем в вашем методе UserProfile(string userNameId)
вы бы проверили, является ли userNameId
числовым, и если да, то установите UserId,если нет, тогда задайте UserName.
Для маршрута нет реального способа узнать разницу, по умолчанию.Вы можете использовать регулярные выражения, но при этом есть ряд ошибок, поэтому это не для слабонервных.
Возможно, вы захотите добавить значения по умолчанию, если у вас есть режим, в котором перечислены профили, если нет имени пользователяили идентификатор отправлен.