【问题标题】:asp.net mvc 4 dropdown list with model isn't working带有模型的 asp.net mvc 4 下拉列表不起作用
【发布时间】:2018-08-03 18:34:52
【问题描述】:

我正在将一个 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; } 

//模型类列表

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 的新手,但缺少一些东西 - 非常感谢您提供的任何帮助!

【问题讨论】:

    标签: asp.net asp.net-mvc-4 html-helper dropdownlistfor


    【解决方案1】:

    您应该使用Model.PlayerSegmentList 作为用于构建选择选项的源集合。所以将它作为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 的第一个参数必须是一个集合,而不是你的类对象!那应该给你一个编译时错误!只需删除该行,因为您已经在 PlayerSegmentList 属性中拥有所需的数据

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

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

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

    我还建议使用 PascalCasing 作为 C# 类名/方法名:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多