Передайте выбранное значение раскрывающегося списка представлению в Html.BeginForm()

Мне нужно передать значения полей из представления в контроллер. Мой код работает для текстового поля, но не работает для раскрывающегося списка. Я видел много ответов для Html.DropdownlistFor, но ни одного для этого случая. Есть ли способ, которым я могу сделать это?

Посмотреть:

@var searchTypes = new SelectList(new[]
{
   new SelectListItem {Value = "0", Text = "Email"},
   new SelectListItem {Value = "1", Text = "Last Name"},
   new SelectListItem {Value = "2", Text = "First Name"},
}, "Value", "Text");

 @using (Html.BeginForm("Index", "Users", new { isSearch = 1, searchTerm = "SearchTerm", searchType="ddlSearchType" }, FormMethod.Post))
{
  <div class="well well-sm search">
      <div class="row">
      <div class="col-sm-6">
        <div class="form-group">
            @Html.TextBox("SearchTerm",(string)ViewBag.SearchTerm, new {name= "SearchTerm", @class = "form-control", placeholder = "Search Term" })

        </div>
    </div>

    <div class="col-sm-3">
        <div class="form-group">
            <div class="controls">
                @Html.DropDownList("ddlSearchType", searchTypes, new { id = "searchtypeselect", @class = "form-control" })

            </div>
        </div>
    </div>

    <div class="col-sm-2">
        <button class="btn btn-primary pull-right" type="submit"><i class="glyphicon glyphicon-search"></i>Search</button>
    </div>
</div>
</div>
}

контроллер:

public ActionResult Index(int? isSearch,string searchTerm,string searchType)
{

}

Этот ответ решает ту же проблему, но у него нет текстового поля в представлении.

Чтобы уточнить, поисковая часть является лишь частью моей точки зрения. У меня есть постраничный список ниже. Поэтому мне нужно поле IsSearch, чтобы увидеть, нажата ли кнопка поиска или это изменение страницы, которое также перейдет к тому же методу действия.

2 ответа

Решение

Ответ буквально там в ссылке, которую вы разместили. Вам необходимо удалить параметр раскрывающегося списка из Html.BeginForm и использовать ту же строку в контроллере и в имени раскрывающегося списка.

@using (Html.BeginForm("Index", "Users", new { isSearch = 1, searchTerm = "SearchTerm"}, FormMethod.Post))


public ActionResult Index(int? isSearch,string searchTerm,string ddlSearchType)
{

}

Чтобы исправить проблему со значениями, вам нужно добавить четвертый параметр в свой контроллер списка поиска, который должен быть выбранным значением.

@var searchTypes = new SelectList(new[]
{
   new SelectListItem {Value = "0", Text = "Email"},
   new SelectListItem {Value = "1", Text = "Last Name"},
   new SelectListItem {Value = "2", Text = "First Name"},
}, "Value", "Text", selectedValueHere);

Затем вы должны изменить свой помощник BeginForm и удалить имеющиеся у вас атрибуты маршрута. Вероятно, у вас нет определенного для них маршрута, и вы хотите, чтобы значения поступали из представления формы, а не из жестко закодированных строк, которые вы отправляете в помощнике. Вы также можете удалить метод, поскольку по умолчанию используется POST.

 @using (Html.BeginForm("Index", "Users",new { isSearch = 1 }))

Наконец, вам нужно настроить имя вашего выпадающего меню, чтобы оно совпадало с именем, ожидаемым в действии POST.

@Html.DropDownList("SearchType", searchTypes, new { id = "searchtypeselect", @class = "form-control" })
Другие вопросы по тегам