#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 .