Отправить новые парамы строк запросов в действие с помощью пользовательской маршрутизации mvc

Мое требование-маршрутизировать 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();

1 ответ

  1. Парамы строки запроса не являются частью маршрута, но modelbinder будет обрабатывать их так же, как парамы маршрута. Другими словами, если вы хотите записать эти конкретные значения строки запроса в действие, просто укажите их в качестве параметров действия:

    public ActionResult Index(int type, string mode)
    

    Теперь, что касается автоматического добавления их в URL, это действительно невозможно. Опять же, поскольку строка запроса не является частью маршрута, в маршруте нельзя указать, что должны существовать определенные парамы строк запроса. Однако можно настроить перенаправление. Например, можно выполнить действие, которое отвечает на /helloworldмаршрут, а затем перенаправляет на нужный URL-адрес:

    public ActionResult HelloWorld()
    {
        return RedirectToAction("Index", "Home", new { type = 1, mode = "view" });
    }
    

    Кроме того, можно добавить перезапись URL-адреса непосредственно в IIS для перенаправления с /helloworldto /home/index?type=1&mode=view. Просто имейте в виду, что при любом подходе фактический URL в адресной строке изменится на тот, с строкой запроса. /helloworldМаршрут будет просто короткий URL, в основном, чтобы получить людей там проще, но никогда не будет отображаться в адресной строке.

    Если вам нужно сохранить /helloworldURL, то вам просто нужно будет создать маршрут для этого, и обрабатывать строки запроса params как значения по умолчанию:

    routes.MapRoute(
        name: "HelloWorld",
        url: "helloworld",
        defaults: new { controller: "Home", action: "Index" }
    );
    

    Затем:

    public ActionResult Index(int type = 1, string mode = "view")