Мое (по общему признанию, ограниченное) понимание
до сих пор это было, если имя переменной
указанный в маршруте соответствует тому, что
указано в действии контроллера
определение, это будет предполагать, что один
независимо от порядка.
Привязка значений маршрута к аргументам действия происходит ПОСЛЕ того, как среда определяет, какой маршрут использовать. Выбор маршрута выполняется с использованием эвристики «первое совпадение выигрывает»: используется первый маршрут, который может успешно соответствовать входящему запросу, даже если позже был определен «лучший» маршрут.
Решение Майкла верное. Сначала необходимо указать маршрут по умолчанию, используя ограничения маршрута, чтобы сопоставлять только те URL-адреса, где идентификатор является числовым. Ваш второй, менее ограничительный маршрут должен последовать.
ПРИМЕЧАНИЕ : если вы следуете решению Михаэля, у вас возникнут проблемы, если у вас есть пользователи с именем пользователя, состоящим только из цифр. Вы могли бы подумать о добавлении к маршрутам какого-либо другого различающего фактора, например, добавив ключевое слово «пользователь» во 2-й:
routes.MapRoute(
"Default", "{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "0" },
new { id = @"\d+" }
);
routes.MapRoute(
"CustomerView", "{controller}/{action}/user/{username}",
new { controller = "Home", action = "Index", username = "" }
);