簡體   English   中英

ASP.NET MVC - 下拉列表 - 沒有類型為&#39;IEnumerable&#39;的ViewData項 <SelectListItem> “

[英]ASP.NET MVC - Dropdown - There is no ViewData item of type 'IEnumerable<SelectListItem>'

MenuType定義:

 public string Code { get; set; } 
 public string Name { get; set; }

ASP.NET MVC 5

在我發布問題之前,我已經搜索過並閱讀了

我正在嘗試加載asp.net mvc下拉列表中的數據為什么這么復雜?

//控制器

public class ClientController : BaseController
{
    public ActionResult Index()
    {
       List<MenuType> ctypelist = db.ContractTypes.OrderBy(x => x.TypeOfContract).ToList();

       IEnumerable<SelectListItem> list = new SelectList(ctypelist.ToList());
       ViewBag.DropDownTypeOfContract = list;
       return View();
    }

}

// HTML

@model myapp.Models.Client


@Html.DropDownList("Codes", (List<SelectListItem>)ViewBag.DropDownTypeOfContract , new { style = "max-width: 600px;" })%>

復雜的是你似乎無法決定你使用的是哪種類型......

首先你有一個List<MenuType> (我假設ContractTypes實際上是MenuType類型?)然后你創建一個SelectList ,將List<MenuType>傳遞給它,這意味着MenuType必須至少有兩個屬性,一個叫做Text ,一個叫Value 如果沒有,則必須在SelectList構造函數參數中指定TextValue屬性名稱。

之后,出於某種原因,您將其轉換為IEnumerable<SelectListItem> ,然后將其分配給ViewBag項並調用您的View。 因此,此時,ViewBag.DropDownTypeOfContract的類型為IEnumerable<SelectListItem>

接下來,在您的視圖中,由於某種原因,您定義了@model而不是將任何模型傳遞給視圖。 好吧,隨你便...

所以現在我們遇到了真正的問題。

@Html.DropDownList("Codes", 
    (List<SelectListItem>)ViewBag.DropDownTypeOfContract , 
     new { style = "max-width: 600px;" })%>

好吧,讓我們暫時忽略一下你有一個WebForms關閉代碼塊指示符(%>)的事實......這里最大的問題是你試圖將ViewBag.DropDownTypeOfContract轉換為List<SelectListItem> ,這不是,而且從來沒有。

您將List<MenuType>轉換為SelectList ,然后將其轉換為IEnumerable<SelectListItem> 從未涉及任何List<SelectListItem>

所以,簡單的修復(除了重寫你的代碼是理智的)是改變你的演員:

@Html.DropDownList("Codes", 
    (IEnumerable<SelectListItem>)ViewBag.DropDownTypeOfContract, 
     new { style = "max-width: 600px;" })

編輯:

由於您的MenuType不包含相應的屬性,因此您必須修改SelectList(我在上面提到)。 僅供參考,ctypelist已經是一個列表,無需再將其轉換為列表......這很愚蠢。

IEnumerable<SelectListItem> list = new SelectList(ctypelist, "Code", "Name");

注意:我發布了這個答案,但不知道您的MenuType類有哪些變量。 請添加到您的問題,我將根據您的MenuType類編輯此答案

所有下拉列表都是值和文本對的集合。

<select>
<option value=1>TEXT 1</option>
<option value=2>TEXT 2</option>
<option value=3>TEXT 3</option>
</select>

您有List<MenuType>List<MenuType> ,您想要在DropDown列表中顯示MenuType中的哪些值?

假設您將此作為MenuType.cs

public class MenuType
{
  public int MenuTypeId {get;set;}
  public string Name {get;set;}

}

你的dropDown應該像這樣生成:

    public ActionResult Index()
    {
       Dictionary<int,string> ctypelist = db.ContractTypes.OrderBy(x => x.TypeOfContract).ToDictionary(s => s.MenuTypeId, s=> s.Name);


IEnumerable<SelectListItem> selectListItems = ctypelist.Select(s => new SelectListItem() { Value = s.Key.ToString(), Text = s.Value });

       ViewBag.DropDownTypeOfContract = selectListItems;
       return View();
    }

在視圖中:

@{
var items = (IEnumerable<SelectListItem>) ViewBag.DropDownTypeOfContract;
}

    @Html.DropDownList("Codes", items , "Select Item")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM