Короче говоря - не существует готового способа сопоставления значений форм с маршрутом.
Лучший способ передать значения обратно на контроллеры mvc - это иметь модель представления.
Создание поисковой модели просмотра.
//View Model
public class SearchViewModel{
public string Query {get;set;}
public string Category {get;set;}
}
В вашем контроллере вы захотите передать это вашему представлению или частичному представлению.
Используйте «ActionResult» в .NET и «IActionResult» в .Net Core
//Controller
public class SearchController{
[HttpGet]
public ActionResult SearchBox(){
return View();
}
[HttpPost]
public ActionResult SearchBox(SearchViewModel model){
//model is now populated with your values from your form.
//ex: model.Query
return View();
}
}
Создайте перечисление для своих категорий, есть много других способов сделать это, но этот самый простой.
//Enum
public enum Categories
{
Category1,
Category2
}
Теперь в вашем бритвенном виде свяжите модель вида, и все готово.
//Razor View
@model SearchViewModel
@using (Html.BeginForm("SearchBox", "Search", FormMethod.Post))
{
@Html.TextBoxFor(x => x.Query, new { @class = "search-form"})
@Html.DropDownListFor(x => x.Catergory,
new SelectList(Enum.GetValues(typeof(Categories))),
"Select Category", new { @class= "example-class"})
<i class="fas fa-caret-down"></i>
<input type="submit" name="" class="submit-full-search">
<div class="search-btn-submit">
<img src="~/img/search.svg">
</div>
}
Если вы хотите, чтобы значения формы публиковались в вашем URL, вы можете изменить ее на FormMethod.Get
//Razor View
@model SearchViewModel
@using (Html.BeginForm("SearchBox", "Search", FormMethod.Get))
{
@Html.TextBoxFor(x => x.Query, new { @class = "search-form"})
@Html.DropDownListFor(x => x.Catergory,
new SelectList(Enum.GetValues(typeof(Categories))),
"Select Category", new { @class= "example-class"})
<i class="fas fa-caret-down"></i>
<input type="submit" name="" class="submit-full-search">
<div class="search-btn-submit">
<img src="~/img/search.svg">
</div>
}
Если вы измените его для получения, вам также придется изменить свой контроллер, чтобы ожидать этого в вашем методе get. Вы также можете просто связать модель, и MVC автоматически отобразит параметры обратно в модель.
public class SearchController{
[HttpGet]
public ActionResult SearchBox(SearchViewModel model){
//if the model values are in the URL "model" will be populated, else it will be null.
return View();
}
}