Проблема в том, что у вас нет маршрута, который соответствует значениям маршрута (контроллер = Дом, действие = Создать).
У вас есть два маршрута, один - пустая строка (без параметров), которая соответствует Controller = "Home", Action = "Index". Другой - ваш хеш-маршрут, который соответствует Controller = "Home", Action = "RequestLink". Таким образом, когда ASP.Net Routing отправляется для создания URL-адреса из предоставленных вами значений маршрута, он не может найти ни одного (поскольку ни один из них не имеет параметров "{controller}" и "{action}").
Самым простым решением в этом случае является создание прямого маршрута к действию «Создать», чтобы вы все еще могли использовать свой маршрут «хеш». Поместите это в верхней части вашего метода RegisterRoutes. ПРИМЕЧАНИЕ: заказ имеет значение ! ASP.Net Routing проверяет каждый маршрут в добавленном порядке, пока не найдет совпадение.
routes.MapRoute(
"Create", // Route name
"Create", // URL with parameters
new { controller = "Home", action = "Create" } // Parameter defaults
);
Поскольку у вас есть этот маршрут «хеш», вы не можете использовать метод «{controller} / {action} / {id}» по умолчанию, поскольку значение «hash» будет считаться допустимым именем контроллера. Поэтому, если кто-то запросит: http://www.mysite.com/fjhas82, MVC будет искать контроллер с именем "fjhas82" и жаловаться, что не может его найти. К сожалению, это означает, что вы должны вручную добавлять новые маршруты для каждого нового действия контроллера (как я показал выше), что является проблемой.
Лучшее решение (на мой взгляд) состоит в использовании ограничений Regex: если ваши хеши имеют очень четко определенный формат (скажем, 5 букв, за которыми следуют 2 цифры, или «_», за которыми следуют любые буквенно-цифровые символы и т. Д.) .) или, если вы хотите навязать такой формат, вы можете использовать ограничения Regex, поддерживаемые маршрутизацией ASP.Net. Тогда вам понадобятся только эти два маршрута
routes.MapRoute(
"Redirect",
"{hash}",
new { controller = "Home", action = "RequestLink" },
new { hash = @"[a-zA-Z]{5}[0-9]{2}" } // Regex Constraints
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index" } // Parameter defaults
);
По этим маршрутам, если MVC видит имя контроллера, например: «Home», он проверит первый маршрут, обнаружит, что он не соответствует регулярному выражению, и перейдет к следующему. ПРИМЕЧАНИЕ: мой синтаксис регулярных выражений может быть немного ржавым, поэтому я бы использовал что-то вроде http://regexpal.com/, чтобы сначала протестировать Regex, чтобы убедиться, что он работает с вашими хэшами и именами контроллеров.
Надеюсь, это поможет, я знаю, что много писал, но MVC настолько гибок, что вы можете делать разные вещи!