Добавить параметры в форму в бритве - PullRequest
0 голосов
/ 01 мая 2018

У меня есть эта форма в моем представлении, которая приводит меня к некоторым действиям в контроллере. Дело в том, что я не знаю, как передать параметры в метод действия.

<form class="full-search" asp-controller="Movies" asp-action="Search">
    <input type="search" name="searchmovie" placeholder="Search..." class="search-form">
    <select name="option" form="">
        <option name="option" value="category1">category 1</option>
        <option name="option" value="category2">category 2</option>
        <option name="option" value="category3">category 3</option>
    </select>
    <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>
</form>

А это мой контроллер:

[HttpGet("searchmoview/{option?}/{searchmovie}")]
public  IActionResult Search(string option, string searchmovie)
{
    //perform some search based on the filters
    return View("Search", data);
}

Но когда я запускаю свой код, когда я нажимаю на поиск, URL выглядит так:

https://localhost:33590/Information/Search

Вместо этого:

https://localhost:44320/seachmovie/category1/{searchString}

Любая идея, ребята, как я могу передать параметры?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Короче говоря - не существует готового способа сопоставления значений форм с маршрутом.

Лучший способ передать значения обратно на контроллеры 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();
    }
}
0 голосов
/ 01 мая 2018

Вы не можете. Это не так, как все работает. По умолчанию форма отправляет запрос POST, и в этом случае входные данные в форме отправляются как часть тела запроса (т.е. не URL). Вместо этого вы можете установить метод на GET, но тогда входные значения будут отправляться как часть строки запроса (т.е. ?foo=bar), а не как часть вашего пути, как вы ищете .

Единственный способ удаленно достичь того, чего вы хотите, - это использовать JavaScript для управления действиями формы, основанными на таких вещах, как изменение поля выбора категории. Вы привязываетесь к событию change этого элемента, а затем каким-то образом изменяете атрибут action элемента формы.

...