将选定的字符串从下拉列表传递给控制器

时间:2018-05-08 11:29:28

标签: c# asp.net-mvc dropdown

我正在显示控制器的下拉列表,如下所示:

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 :(得分:2)

你的助手应该是:

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

基本上你的助手会被渲染为这样的输入:

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

form POST上,您的控制器将能够根据输入的name属性绑定您的值。

答案 1 :(得分:1)

@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

答案 2 :(得分:1)

您可以使用强类型视图返回选定的下拉列值。

创建简单的类,如下所示

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*
}