【问题标题】:How to display a simple list from Controller to view in select element on View? [duplicate]如何从控制器显示一个简单列表以在视图的选择元素中查看? [复制]
【发布时间】:2018-10-20 04:25:58
【问题描述】:

每当我尝试以下代码时,我的应用程序似乎都能正常工作:

查看:Index.cshtml

@{
    List<SelectListItem> listItems = new List<SelectListItem>();
    listItems.Add(new SelectListItem
    {
        Text = "Exemplo1",
        Value = "Exemplo1"
    });
    listItems.Add(new SelectListItem
    {
        Text = "Exemplo2",
        Value = "Exemplo2",
        Selected = true
    });
    listItems.Add(new SelectListItem
    {
        Text = "Exemplo3",
        Value = "Exemplo3"
    });
}

@Html.DropDownList("name", listItems)

但我不希望这样的列表在视图中发生任何逻辑。相反,我希望控制器来处理这个:

控制器:SelectionController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace ExampleMVC.Controllers
{
    public class SelectionController : Controller
    {
        // GET: Selection
        public ActionResult Index()
        {
            //For first dropdown:
            List<SelectListItem> optionList1 = new List<SelectListItem>();
            optionList1.Add(new SelectListItem
            {
                Text = "Option 1",
                Value = "Option 1"
            });
            optionList1.Add(new SelectListItem
            {
                Text = "Option 2",
                Value = "Option 2"
            });
            optionList1.Add(new SelectListItem
            {
                Text = "Option 3",
                Value = "Option 3"
            });

            //For second dropdown:
            List<SelectListItem> optionList2 = new List<SelectListItem>();
            optionList1.Add(new SelectListItem
            {
                Text = "Option 1",
                Value = "Option 1"
            });
            optionList1.Add(new SelectListItem
            {
                Text = "Option 2",
                Value = "Option 2"
            });
            optionList1.Add(new SelectListItem
            {
                Text = "Option 3",
                Value = "Option 3"
            });


            List<SelectList> optionList3 = new List<SelectList>();
            optionList1.Add(new SelectListItem
            {
                Text = "Option 4",
                Value = "Option 4"
            });
            optionList1.Add(new SelectListItem
            {
                Text = "Option 5",
                Value = "Option 5"
            });
            optionList1.Add(new SelectListItem
            {
                Text = "Option 6",
                Value = "Option 6"
            });

            List<SelectListItem> listItems = new List<SelectListItem>();
            listItems.Add(new SelectListItem
            {
                Text = "Exemplo1",
                Value = "Exemplo1"
            });
            listItems.Add(new SelectListItem
            {
                Text = "Exemplo2",
                Value = "Exemplo2",
                Selected = true
            });
            listItems.Add(new SelectListItem
            {
                Text = "Exemplo3",
                Value = "Exemplo3"
            });
            ViewBag.listItems = listItems;

            ViewBag.optionList1 = optionList1;
            ViewBag.optionList2 = optionList2;
            ViewBag.optionList3 = optionList3;
            return View();
        }
    }
}

每当我尝试在我的视图中调用ViewBag.listItems 时,例如:

@Html.DropDownList("name", ViewBag.listItems)

这将返回一个错误:

“HtmlHelper”没有名为“DropDownList”的适用方法,但似乎有一个使用该名称的扩展方法。扩展方法不能动态调度。考虑强制转换动态参数或调用扩展方法而不使用扩展方法语法。

我该如何解决这个问题?

编辑:

使用:@Html.DropDownList("name", (SelectList) ViewBag.listItems)

将导致:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法将 System.Collections.Generic.List 的类型转换为 System.Web.Mvc.SelectList

【问题讨论】:

  • 您必须将其转换为 (SelectList)
  • @TetsuyaYamamoto 我要一个简单的例子,将列表从控制器传递到视图(不使用任何奇怪的查询、数据库或模型,这可能会吓到读者)。每当有类似问题的人可能正在寻找此问题时,标题就会更加清晰。也不一定与 MVC3 相关。
  • @Barrosy 你的问题和引用的问题本质上是一样的,因为两者都暗示你不应该直接在DropDownList 助手中使用ViewBag。相反,您需要转换为 SelectListIEnumerable&lt;SelectListItem&gt; 类型。
  • @TetsuyaYamamoto 请参考我的编辑。

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


【解决方案1】:

您可以将ViewBag.Item 传递到您的下拉列表中。

@Html.DropDownList("name", new SelectList(ViewBag.listItems, "Value", "Text"))

@Html.DropDownList("name", (IEnumerable<SelectListItem>)ViewBag.listItems)

【讨论】:

  • 但是,我建议创建一个视图模型并将其传递给您的视图,并尽可能避免使用ViewBag 的用户,因为维护动态变量很麻烦。
  • 显然使用第一个选项,SelectListItem 类的bool Disabled 属性似乎无法正常工作,从我一直在阅读的内容来看,必须指出一个是指一个 IEnumerable尝试使用时输入 SelectListItem。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多