ASP MVC如何绑定dropdownlist

时间:2015-02-05 10:02:04

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

我是ASP.Net MVC 5的新手,我在理解下拉列表时遇到了问题。

我想显示一个绑定DTO对象的表单(因为该表单不会将数据库表一对一映射)。我的表单必须显示以下字段:

Name (edit box)
Address (edit box)
Type (dropdownlist that show always 3 fixed values: "Type1", "Type2" and "Type3"

如何编写DTO对象类和两个Create操作(显示表单的那个和处理帖子的另一个)?

我找到了一些在DTO对象中使用enum的解决方案,其他在创建操作(GET)中使用viewbag的解决方案......我很困惑!!!

1 个答案:

答案 0 :(得分:3)

Trick是使用SelectListItem并使用DropDownFor。

在视图模型上创建一个属性,如

public class ViewModel {
  string SelectedItem { get; set; }
  List<SelectListItem> Items { get; set; }
}

在您的控制器中:

public ActionResult Edit() {
  var items = new List<SelectListItem>() { 
    new SelectListItem() {Text = "Option1Text", Value = "Value1Text"},
    new SelectListItem() {Text = "Option1Text", Value = "Value1Text"},
    new SelectListItem() {Text = "Option1Text", Value = "Value1Text"}};
  var model = new ViewModel() { Items = items };

  return View(model);
};

在你看来

@model ViewModel

@Html.DropDownFor(x => x.SelectedItem, Model.Items)

然后,您可以在操作中获取所选值:

[HttpPost]
public ActionResult Edit(ViewModel model) {
   var whatWasSelected = model.SelectedItem; // This will be "OptionXValue"
   // Do more things
}

如果您要重新渲染视图,还应该对响应表单提交的任何操作重新填充选择列表项。这是因为选项集合不是通过原始请求传输的,因此ASP.NET MVC不知道如何自己重建集合。通过这样做,当您尝试在SelectListItem集合中设置所选项时,您将避免任何令人讨厌的异常。总体而言,响应行动看起来更像是:

[HttpPost]
public ActionResult Edit(ViewModel model) {
  var items = new List<SelectListItem>() { 
    new SelectListItem() {Text = "Option1Text", Value = "Value1Text"},
    new SelectListItem() {Text = "Option1Text", Value = "Value1Text"},
    new SelectListItem() {Text = "Option1Text", Value = "Value1Text"}};
   model.Items = items;

   var whatWasSelected = model.SelectedItem; // This will be "OptionXValue"
   // Do more things
}