asp.net 带有模型的 mvc 4 下拉列表不工作

asp.net mvc 4 dropdown list with model isn't working

我正在将 asp.net 表单网站转换为 MVC,但我遇到了下拉列表问题。

模型摘录:
命名空间 adminLte.Models
//然后再往下

[Required(ErrorMessage = "Player Segment Required")]  
[Display(Name = "Player Segment")]  
public string Segment { get; set; }  
public IEnumerable<SelectListItem> PlayerSegmentList { get; set; } 

//型号class列表

public IEnumerable<SelectListItem> getPlayerSegmentList()  
{  
  List<SelectListItem> myList = new List<SelectListItem>();  
  var data = new[]{  
   new SelectListItem{ Value="&amp;Segment=1000",Text="1,000+"},  
   new SelectListItem{ Value="&amp;Segment=750-999",Text="750-999"},  
   new SelectListItem{ Value="&amp;Segment=500-749",Text="500-749"},  
   new SelectListItem{ Value="&amp;Segment=400-499",Text="400-499"}
  };
  myList = data.ToList();
  return myList;
}  

控制器:
//??不确定...

playerExtract objModel = new playerExtract();
objModel.PlayerSegmentList = objModel.getPlayerSegmentList();
ViewBag.pSeg = new SelectList(objModel, "SegmentID", "Segment"); 

*HTML form*  
@Html.LabelFor(model => model.Segment, htmlAttributes: new {  @class = "control-label col-md-2" })  
@Html.DropDownListFor( model => model.Segment, ViewBag.pSeg as SelectList  , new { htmlAttributes = new { @id = "Segment", @class = "form-control" } })  
@Html.ValidationMessageFor(model => model.Segment, "", new { @class = "text-danger" })  

//结果 编译错误

There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Segment'.  

我是 MVC 的新手,缺少一些东西 - 非常感谢提供的任何帮助!

您应该使用 Model.PlayerSegmentList 作为用于构建 select 选项的源集合。因此,将其作为 Html.DropDownListFor 方法调用的第二个参数传递。

@Html.DropDownListFor(model => model.Segment, Model.PlayerSegmentList,
                 new { htmlAttributes = new { @id = "Segment", @class = "form-control" } })

同样在您的控制器代码中,这一行没有任何意义!

ViewBag.pSeg = new SelectList(objModel, "SegmentID", "Segment"); 

SelectList的第一个参数必须是一个集合,而不是你的class对象!那应该给你一个编译时错误!。只需删除该行,因为您已经在 PlayerSegmentList 属性

中拥有所需的数据

所以您清理后的控制器代码将是

public ActionResult Create()
{
  var vm = new YourVieWModel();
  var objModel = new playerExtract();
  vm.PlayerSegmentList = objModel.getPlayerSegmentList();
  return View(vm); 
}

假设你的视图是强类型的,那么这应该可以工作 YourViewModel

我还建议使用 PascalCasing 用于 C# class names/method 名称 :)