【问题标题】:How to save a dynamic dropdown list in MVC?如何在 MVC 中保存动态下拉列表?
【发布时间】:2015-10-18 02:15:44
【问题描述】:

我遇到了一个问题。我目前正在尝试制作一个用户页面,其中一些下拉菜单是可变的,并由他们的“访问级别”确定。然后我想将视图中的数据保存到列表中,然后在“发布”控制器方法中处理它。我找到了这个关于可能解决方案的链接 (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 代码行上。

感谢您的帮助!

【问题讨论】:

  • ViewBag.DropDownDataIEnumerable&lt;SelectListItem&gt; 的类型,而不是 SelectList,因此尝试像使用 (SelectList)ViewBag.DropDownData 那样进行转换会引发异常 - 它需要是 (IEnumerable&lt;SelectListItem&gt;)ViewBag.DropDownData。注意SelectListIEnumerable&lt;SelectListItem&gt;,但IEnumerable&lt;SelectListItem&gt; 不是SelectList

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


【解决方案1】:

尝试创建一个新的选择列表并将您的选择列表项放入其中。

@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)

}

【讨论】:

  • 谢谢,更简单的解决方案!
  • 很棒的@Eli Hellmer,很乐意提供帮助。
  • 第一个例子可以工作,但第二个例子不行(它不会根据属性Assigner的值选择正确的选项。请参阅this answer的解释
【解决方案2】:

我相信您正在尝试将 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")

希望这对你有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多