Пользовательский маршрут MVC и поведение BeginForm
Я добавил собственный маршрут:
RouteTable.Routes.Insert(
0,
new Route(
"common/scripts",
new EmbeddedScriptRouteHandler()
)
);
Теперь, когда я использую BeginForm для рендеринга тега Form в представлении, URL-адрес, сгенерированный BeginForm, изменяется. Так, например, без этого пользовательского маршрута, @Html.BeginForm("Index", "Home")
сгенерирует тег Form с действием "/Home/Index"
, Как только я добавлю этот новый маршрут, действие формы тега станет "/common/scripts?action=Index&controller=Home"
, Почему это изменилось?
Мой желаемый результат заключается в том, что любой URL "/common/scripts"
обрабатывается моим пользовательским маршрутом, но все другие URL-адреса обрабатываются по умолчанию.
1 ответ
Он изменился, потому что этот маршрут включен в качестве первого маршрута, поэтому, когда MVC пытается создать URL-адрес, он всегда найдет его. Поскольку он не имеет сегментов или значений по умолчанию, маршрут всегда совпадает, и любые параметры, такие как контроллер / действие, включаются в качестве значений строки запроса.
Вы можете добавить сегмент в определении маршрута для scriptName
(даже если он не будет использоваться вашим обработчиком маршрута). Таким образом, этот маршрут не будет выбран при создании URL, если вы не передадите значение для scriptName
,
RouteTable.Routes.Insert(0,
new Route(
"common/scripts/{scriptName}",
new EmbeddedScriptRouteHandler()
)
);
Другой вариант - установить значение по умолчанию для контроллера, которое не соответствует ни одному из ваших контроллеров. Таким образом, при создании URL-адресов в MVC этот маршрут всегда будет исключен, поскольку ни один из ваших контроллеров не будет соответствовать этому значению. Это не должно иметь никакого другого эффекта при разрешении входящих маршрутов, так как вы используете свой собственный обработчик маршрутов.
Что-то вроде этого:
RouteTable.Routes.Insert(0,
new Route(
"common/scripts",
new RouteValueDictionary(new { controller = "AControllerThatDoesntExists"}),
new EmbeddedScriptRouteHandler()
)
);