我遇到了一个问题。我目前正在尝试创建一个用户页面,其中一些下拉列表是可变的,并由“访问级别”确定。然后我想将视图中的数据保存到列表中,然后在“Post”控制器方法中处理它。我找到了关于可能的解决方案(Assign selectlist to dynamically created dropdown in MVC)的链接,但我仍遇到问题。
这是我用来设置需要生成下拉列表的数据的控制器代码:
var permData = db.LabPermissions.Where(x => x.AccessLevel == 1).ToList();
//sets up generic dropdown data used for all dropdowns
ViewBag.DropDownData = new List<SelectListItem>
{
new SelectListItem{ Value = "0",Text = "No"},
new SelectListItem{ Value = "1",Text = "Yes"},
};
ViewModel obj = new ViewModel();
obj.DataFromController = permData;
//other viewmodel data
return("MyView",obj);
然后我将数据传递给我的视图,看起来像这样(这也是堆栈溢出链接如何设置视图)
@for(int i = 0; i < Model.DataFromController.Count(); i++)
{
<div class="row">
<div class="col-md-2">
<b>@Html.DisplayFor(m => m.DataFromController[i].Lab.LabName)</b>
</div>
<div class="col-md-2">
@Html.DropDownListFor(m => m.DataFromController[i].Assigner, (SelectList)ViewBag.DropDownData, "Select One")
</div>
<div class="col-md-8">
</div>
</div>
}
在我完成此设置并运行应用程序后,这是我收到的错误:
Additional information: Cannot convert type 'System.Collections.Generic.List<System.Web.Mvc.SelectListItem>' to 'System.Web.Mvc.SelectList'
错误发生在我视图中的@ Html.DropDownListFor代码行中。
感谢您的帮助!
答案 0 :(得分:1)
我相信您正在尝试将SelectListItem强制转换为SelectList,这就是您收到该错误的原因。我已经完成了与项目一部分相同的功能,并且我从数据库中获取了下拉列表的值。 并且为了显示,这是我的代码(根据你的模型变量修改了一下
我的控制器方法
public ActionResult GetDropDownList()
{
List<SelectListItem> dropDownList= new List<SelectListItem>();
using (var context = new assessmentEntities())
{
//getting data from the DB
var result = context.getDataFromDB().toList();
foreach (var item in result)
{
dropDownList.Add(new SelectListItem() { Text = item.Variable1, Value = item.Variable2});
}
ViewBag.DropDownData = dropDownList;
}
return View();
}`
这是我的观点
@Html.DropDownListFor(m => m.DataFromController[i].Assigner,, new SelectList(ViewBag.DropDownData, "Value", "Text")
希望这对你有用
答案 1 :(得分:1)
尝试创建一个新的选择列表,并将您的selectlistitems放入其中。
@Html.DropDownListFor(m => m.DataFromController[i].Assigner,
new SelectList(ViewBag.DropDownData, "Value", "Text", "Select One")
或者,因为您有一个ViewModel
,您可以添加一个可以容纳您的选择列表项的公共属性。
public class ViewModel
{
public IEnumerable<SelectListItem> DropDownData { get; set; }
}
控制器:
var permData = db.LabPermissions.Where(x => x.AccessLevel == 1).ToList();
var vm = new ViewModel();
var list = new List<SelectListItem>
{
new SelectListItem{ Value = "-1", Text = "Select One", Selected = true},
new SelectListItem{ Value = "0",Text = "No"},
new SelectListItem{ Value = "1",Text = "Yes"}
};
vm.DropDownData = list;
vm.DataFromController = permData;
return View(vm);
查看:
@model YourNameSpace.Models.ViewModel
@for(int i = 0; i < Model.DataFromController.Count(); i++){
@Html.DropDownListFor(m => m.DataFromController[i].Assigner, Model.DropDownData)
}