通过响应将选择传递到控制器

时间:2013-12-11 15:37:38

标签: asp.net-mvc asp.net-mvc-5

HY,

我是ASP.NET MVC 5的新手。我试图获得HTML选择的价值而没有成功。

我的观点(重要部分):

<div class="form-group">
    @Html.Label("Country", new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
        @Html.DropDownList("Countries", (IEnumerable<SelectListItem>)ViewBag.Countries, new { @class = "form-control", id = "Country", name = "Country" })
    </div>
</div>

我的控制器(必不可少的部分):

public ActionResult Index()
{
    string country = Request["Country"]; // here I always get null
}

我需要一个新手解释为什么这不起作用以及我如何让它工作,请:)

1 个答案:

答案 0 :(得分:2)

首先,我同意@Maess。不要使用ViewBag。这太可怕了,微软的某个人应该被打耳光,因为它首先要把它作为一个选项加入。

那就是说,你的错误在这里非常明显。您将您的选择命名为“国家/地区”,并且您尝试从请求中提取“国家/地区”。

既然你是新手,我会很高兴,并为此安排如何使用视图模型。首先,创建一个模型:

public class IndexViewModel
{
    public int SelectedCountry { get; set; }
    public IEnumerable<SelectListItem> CountryChoices { get; set; }
}

然后在你的行动中:

// GET
public ActionResult Index()
{
    var model = new IndexViewModel();

    // get your country list somehow

    // where `Id` and `Name` are properties on your country instance.
    model.CountryChoices = countries.Select(m => new SelectListItem { Value = m.Id, Text = m.Name });

    return View(model);
}

在你看来:

@model Namespace.IndexViewModel

...

@Html.DropDownListFor(m => m.SelectedCountry, Model.CountryChoices, new { @class = "form-control" })

最后,在你的POST动作中:

[HttpPost]
public ActionResult Index(IndexViewModel model)
{
    // use model.SelectedCountry
}