Мое требование-маршрутизировать URL(например: http://www.mywebsite.com / helloworld) к необходимому контроллеру (home) и действию(index?type=1 & mode=view) динамически. Здесь я сохраняю входящий url, целевой контроллер + action + querystring params в базе данных. Для этого я использую пользовательский обработчик маршрута, который наследует MvcRouteHandler, и в методе обработчика GetHttpHandler я обновляю значения данных маршрута с именем контроллера, действием, парами и т. д. Все это прекрасно работает, но проблема в том, что я не могу получить парамы querystring с помощью запроса.Querystring [«type»], но можно получить значения либо как парамы действий, либо из запроса.RequestContext.RouteData.Значения [«type»]. Может ли кто-нибудь сказать мне, что изменения, которые мы должны сделать, чтобы получить значения с помощью запроса.Строки запроса
routes.MapRoute(
name: "CustomUrlRoute",
url: "{*CustomUrl}",
defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional },
namespaces: new[] { "TestPortal.Controllers" },
constraints: new { controller = @"^(?!services)w+$" }
).RouteHandler = new CustomUrlRouteHandler();
Парамы строки запроса не являются частью маршрута, но modelbinder будет обрабатывать их так же, как парамы маршрута. Другими словами, если вы хотите записать эти конкретные значения строки запроса в действие, просто укажите их в качестве параметров действия:
Теперь, что касается автоматического добавления их в URL, это действительно невозможно. Опять же, поскольку строка запроса не является частью маршрута, в маршруте нельзя указать, что должны существовать определенные парамы строк запроса. Однако можно настроить перенаправление. Например, можно выполнить действие, которое отвечает на
/helloworld
маршрут, а затем перенаправляет на нужный URL-адрес:Кроме того, можно добавить перезапись URL-адреса непосредственно в IIS для перенаправления с
/helloworld
to/home/index?type=1&mode=view
. Просто имейте в виду, что при любом подходе фактический URL в адресной строке изменится на тот, с строкой запроса./helloworld
Маршрут будет просто короткий URL, в основном, чтобы получить людей там проще, но никогда не будет отображаться в адресной строке.Если вам нужно сохранить
/helloworld
URL, то вам просто нужно будет создать маршрут для этого, и обрабатывать строки запроса params как значения по умолчанию:Затем: