Передайте выбранное значение раскрывающегося списка в представление в 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, чтобы увидеть, нажата ли кнопка поиска или это изменение страницы, которое также перейдет к тому же методу действия.


person TheFallenOne    schedule 17.05.2017    source источник


Ответы (2)


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

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


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

}
person The_Outsider    schedule 17.05.2017

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

@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" })
person Shane Bauer    schedule 17.05.2017
comment
Мне по-прежнему понадобится параметр IsSearch, который не является частью какого-либо элемента управления. Это помогает мне видеть, была ли нажата кнопка поиска или нет. Так что не могу убрать все параметры, как ваше предложение. - person TheFallenOne; 17.05.2017
comment
Зачем вам это знать? Разве действие POST не указывает на это? - person Shane Bauer; 17.05.2017
comment
Хорошо. Скорректировал это - person Shane Bauer; 17.05.2017