Передача выбранной строки из выпадающего списка в контроллер - PullRequest
0 голосов
/ 08 мая 2018

Я показываю выпадающий список из моего контроллера следующим образом:

public ActionResult Index()
    {
        var title = new List<String>()
        {
            "English", "French", "Spanish"
        };
        List<SelectListItem> languageList = new List<SelectListItem>();
        string defaultTitle = "Language";
        foreach (var item in title)
        {
            languageList.Add(new SelectListItem()
            {
                Text = item,
                Value = item,
                Selected = (item == defaultTitle ? true : false)
            });
        }
        ViewBag.LanguageList = languageList;

        return View();
    }

Мой взгляд выглядит следующим образом:

   @using (Html.BeginForm("GetStatusTrad", "StatusTradController", FormMethod.Post))
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Translation</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @Html.Label("Language")
            @Html.DropDownList("lang", new SelectList(ViewBag.LanguageList, "Text", "Value"), "Language")
        </div>
    </div>

        <div></div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>

}

Он правильно отображает раскрывающийся список, но когда я хочу передать выбранное значение действию контроллера, я получаю ошибку 404.

Мое действие:

public ActionResult GetStatusTrad(string language)
    {
      *some code*
    }

Есть идеи, почему я не могу передать выбранное значение раскрывающегося списка в контроллер?

Ответы [ 3 ]

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

@Html.DropDownList("lang", new SelectList(... генерирует <select> с name="lang. Вам нужно изменить параметр в методе POST, чтобы он соответствовал

public ActionResult GetStatusTrad(string lang)

Как примечание: LanguageList уже IEnumerable<SelectListItem>, поэтому бессмысленно использовать new SelectList() для создания другого идентичного. Я могу быть просто

@Html.DropDownList("lang", (IEnumerable<SelectListItem>)ViewBag.LanguageList, "Language")

У вас также есть опечатка в методе BeginForm(). Это должно быть

@using (Html.BeginForm("GetStatusTrad", "StatusTrad", FormMethod.Post))

т.е. "StatusTrad", а не "StatusTradController" (если вы действительно не назвали свой контроллер StatusTradControllerController)

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

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

создайте простой класс, как показано ниже

public class myModel
{
    public string language { get; set; }
    ....
    ....
}

Затем используйте этот класс / модель в Просмотр

@model yourProject.Models.myModel
<div class="form-group">
    <label class="col-lg-2 control-label">Language</label>
    <div class="col-lg-5">
        @Html.ValidationMessageFor(m => m.language)
        @Html.DropDownListFor(m => m.language, new SelectList(ViewBag.LanguageList, "Text", "Value"), "-- Select --", new { @class = "form-control" })
    </div>
</div>

Метод контроллера выглядит следующим образом

[HttpPost]
public ActionResult GetStatusTrad(myModel model)
{
  *some code*
}
0 голосов
/ 08 мая 2018

Ваш помощник должен быть:

@Html.DropDownList("language", <-- note this
 new SelectList(ViewBag.LanguageList, "Text", "Value"), "Language")

Это произошло потому, что ваш помощник будет отображаться так:

<select name="language">
...
</select>

И на form POST ваш контроллер сможет связывать ваши значения на основе name свойства ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...