Как я могу заставить значения формы отображаться в виде сегментов URL?

#c# #asp.net #asp.net-mvc #asp.net-mvc-4 #routes

#c# #asp.net #asp.net-mvc #asp.net-mvc-4 #маршруты

Вопрос:

У меня есть сайт магазина, который использует MVC 4. У меня возникли проблемы с правильным маршрутом. В настоящее время он просто публикует строку поиска. Я хочу, чтобы он отображал строку поиска каждый раз. В макете сайта у меня есть окно поиска, которое использует этот код:

_SiteLayout.cshtml:

 @using (Html.BeginForm("Search", "Catalog"))
{
     <div class="input-group">
          @Html.TextBox("searchString", "", new Dictionary<string, object> {{"placeholder", "Enter something to search"}, {"class", "form-control input-search"}})
          <span class="input-group-btn">
               <button class="btn btn-default no-border-left" type="submit"><i class="fa fa-search"></i></button>
          </span>
      </div>
}
 

Мой routeconfig использует это:

RouteConfig.cs:

 routes.MapRoute(
        "Search",
        "Catalog/Search/{searchString}",
        new {controller = "Catalog", action = "Search", searchString = string.Empty});
 

Когда кто-то вводит что-то в поле поиска на странице, оно перенаправляет их в /Catalog/Search . Функция поиска отлично работает, но я хочу, чтобы она отображала этот URL:
/Catalog/Search/я искал что-то

Любая помощь была бы отличной. Спасибо!

Ответ №1:

Такое поведение не контролируется MVC. Если вы отправляете форму через POST, значения формы будут отправлены в теле запроса. Если вы отправляете через GET, значения будут созданы в строке запроса. Это контролируется браузером.

Сразу же я вижу одно возможное решение, которое заключается в том, чтобы принять значения в строке запроса и перенаправить на то же действие, используя вместо этого значение запроса в качестве параметра маршрута (редактировать: думая об этом, это все равно должно работать, если исходный запрос является POST):

 @using (Html.BeginForm("Search", "Catalog", FormMethod.GET))
 

А затем в вашем действии:

 public ActionResult Search(string searchString)
{
    if(!string.IsNullOrEmpty(Request["searchString"]))
    { 
        return RedirectToAction("Search", new { searchString });
    }

    /* Do the rest of your processing here */
}
 

Это должно проверить, было ли значение в строке запроса, и, если оно было, повторно выполнить запрос GET для того же действия. Поскольку MVC теперь находится под контролем, он должен учитывать ваш маршрут и указывать параметр в пути вместо строки запроса.

Это, конечно, дополнительный HTTP-запрос для каждого поиска, но это должно быть довольно тривиально.

В качестве альтернативы вы можете использовать jQuery для чтения значения формы, создания URL-адреса и выполнения перенаправления.

Комментарии:

1. Отлично! Это именно то, что мне было нужно. Мне также пришлось изменить строку поиска в конфигурации маршрута на UrlParameter . Необязательно вместо значения по умолчанию string . Пусто. Он просто каждый раз устанавливал его пустым. На данный момент URL выглядит как «/Catalog/Search/ я что-то искал», но я могу понять, как изменить пробелы на . РЕДАКТИРОВАТЬ: И да, это все еще работает, если это post вместо get .