如何在MVC中保存动态下拉列表?

时间:2015-07-27 18:41:32

标签: c# html asp.net-mvc database

我遇到了一个问题。我目前正在尝试创建一个用户页面,其中一些下拉列表是可变的,并由“访问级别”确定。然后我想将视图中的数据保存到列表中,然后在“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代码行中。

感谢您的帮助!

2 个答案:

答案 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)

}