Không có mục ViewData nào thuộc loại 'IEnumerable <SelectListItem>' có khóa 'xxx'


87

Có một vài bài đăng về điều này trên Stack Overflow nhưng không có bài đăng nào có câu trả lời dường như có thể khắc phục được sự cố trong tình huống hiện tại của tôi.

Tôi có một trang với một bảng trong đó, mỗi hàng có một số trường văn bản và một danh sách thả xuống. Tất cả các trình đơn thả xuống cần sử dụng cùng một dữ liệu SelectList, vì vậy tôi đã thiết lập nó như sau:

Bộ điều khiển

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");

Lượt xem

<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>

Tôi đã sử dụng chính xác thiết lập này ở nhiều nơi, nhưng vì một số lý do trong chế độ xem cụ thể này, tôi gặp lỗi:

Không có mục ViewData nào thuộc loại 'IEnumerable' có khóa 'submarket_0'.


1
Bạn đã thử cái này chưa? <%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %>DropDownList mất IEnumerable<SelectListItem>.
LukLed

@LukLed - đó thực sự là cách cuối cùng tôi đã tìm ra nguồn gốc của lỗi :) cũng như thông tin từ một số bài đăng khác! Cảm ơn
Jimbo

<%= Html.DropDownList("submarket_0", ViewData["Submarkets"] as IEnumerable<SelectListItem>, "(none)") %>
Arvis

Gặp phải vấn đề này ngày hôm nay và thấy đối số thứ hai trong trình trợ giúp DropDownList của tôi không có giá trị, theo phát hiện bên dưới từ @jonathansewell.
Ken Palmer

Câu trả lời:


79

Ok, vì vậy câu trả lời được rút ra từ một số bài đăng khác về vấn đề này và nó là:

Nếu của bạn ViewDatacó chứa SelectListcùng tên với DropDownListnghĩa là "submarket_0" của bạn, trình trợ giúp Html sẽ tự động điền DropDownListdữ liệu đó của bạn vào nếu bạn không chỉ định tham số thứ 2 mà trong trường hợp này là nguồn SelectList.

Điều gì đã xảy ra với lỗi của tôi là:

Bởi vì bảng chứa danh sách thả xuống ở chế độ xem một phần và bảng ViewDatađã bị thay đổi và không còn chứa danh sách SelectListmà tôi đã tham chiếu, nên HtmlHelper(thay vì đưa ra lỗi) đã cố gắng tìm SelectList có tên "submarket_0" trong ViewData (GRRRR! !!) mà nó VẪN không thể tìm thấy, và sau đó đã gây ra lỗi cho nó :)

Hãy sửa lại cho tôi nếu tôi sai


104
Tôi gặp lỗi này vì bộ sưu tập SelectListItems của tôi cho danh sách thả xuống bị trống, đây cũng là vấn đề bạn gặp phải, tôi nghĩ.
Jonathan Sewell

6
Đối với những người khác gặp phải sự cố này, hãy tạm thời bọc danh sách thả xuống của bạn trong một kiểm tra rỗng, ví dụ: @if (ViewData ["Submarkets"]! = Null). Nếu sau đó chế độ xem hiển thị mà không gặp lỗi (và không có danh sách thả xuống) thì bạn sẽ xác định được vấn đề của mình. Lỗi "không có mục dữ liệu xem" rất dễ gây hiểu lầm trong trường hợp này.
GDB

Tôi gặp phải điều này bằng cách sử dụng Ajax.ActionLink. Chỉ cần thêm SelectList Getvào ActionMethodcó chứa lệnh gọi Ajax.
bốc mùi vào

Vâng! Tôi đã thay đổi tên của danh sách mà tôi đang chuyển vào ViewData từ bộ điều khiển và đã không thay đổi nó trong chế độ xem. Đó là một thông báo lỗi thực sự khủng khiếp khó hiểu!
neminem

1
@JonathanSewell cảm ơn bạn, cảm ơn bạn, cảm ơn bạn! Đây là vấn đề chính xác của tôi.
johnw182

29

Câu hỏi cũ, nhưng đây là một lời giải thích khác về vấn đề. Bạn sẽ gặp lỗi này ngay cả khi bạn đã nhập mạnh các chế độ xem và không sử dụng ViewData để tạo danh sách thả xuống của mình. Lý do của lỗi có thể trở nên rõ ràng khi bạn nhìn vào nguồn MVC :

// If we got a null selectList, try to use ViewData to get the list of items.
if (selectList == null)
{
    selectList = htmlHelper.GetSelectData(name);
    usedViewData = true;
}

Vì vậy, nếu bạn có một cái gì đó như:

@Html.DropDownList("MyList", Model.DropDownData, "")

Model.DropDownDatalà null, MVC xem qua ViewData của bạn để tìm thứ gì đó có tên MyListvà thông báo lỗi nếu không có đối tượng nào trong ViewData có tên đó.


1
Xin chào, đây cũng là vấn đề của tôi, Chúng tôi phải làm gì nếu danh sách là rỗng! bạn có thể đề nghị một cái gì đó,
biến

4
@transformer Điều dễ dàng nhất để làm là đặt Model.DropDownData thành một danh sách trống thay vì null. Nếu không thể, bạn có thể thay đổi đánh dấu dao cạo của mình để kiểm tra xem danh sách có rỗng hay không và nếu có, hãy hiển thị danh sách chọn trống.
hawkke

15

Tôi đã gặp lỗi tương tự, tôi nghĩ vấn đề là văn bản lỗi gây nhầm lẫn , bởi vì nó đặt tên khóa sai.

Trong trường hợp của bạn Nó sẽ nói "Không có mục ViewData nào thuộc loại 'IEnumerable' có khóa" Submarkets "".

Lỗi của tôi là lỗi chính tả trong mã chế độ xem ("Thị trường phụ" của bạn), nhưng văn bản lỗi đã khiến tôi phát điên.

Tôi đăng câu trả lời này vì tôi muốn nói rằng những người đang tìm kiếm lỗi này, giống như tôi, rằng vấn đề là nó không tìm thấy IENumerable, mà là trong var mà nó phải tìm nó ("Submarkets" trong trường hợp này), không có trong trang bị lỗi ("submarket_0") .

Câu trả lời được chấp nhận là rất thú vị, nhưng như bạn đã nói quy ước được áp dụng nếu bạn không chỉ định tham số thứ 2, trong trường hợp này nó đã được chỉ định, nhưng var không được tìm thấy (trong trường hợp của bạn vì viewdata không có, trong trường hợp của tôi là vì Tôi viết sai chính tả tên var)

Hi vọng điêu nay co ich!


9

Vấn đề là do đăng lại xảy ra khi nhấp vào nút gửi. Vì vậy, trong khi đăng dữ liệu khi gửi, hãy nhấp lại viết trước khi trả về Chế độ xem ()

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");

3

Kiểm tra Không gian tên.

Bạn có thể gán System.Web.Webpages.Html.SelectListItem trong Controller, thay vì System.Web.Mvc.SelectListItem .


1

Điều này cũng ổn; Ví dụ:
==> Trong tệp "NumberController":

public ActionResult Create([Bind(Include = "NumberId,Number1,Number2,OperatorId")] Number number)
{
    if (ModelState.IsValid)
    {
        ...
        ...
        return RedirectToAction("Index");
    }
    ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", 
                                "OperatorSign", number.OperatorId);                
    return View();
}

==> Trong tệp Xem (Create.cshtml):

<div class="form-group">
    @Html.LabelFor(model => model.Number1, htmlAttributes: new { @class = 
                   "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Number1, new { htmlAttributes = new { 
                        @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Number1, "", new { @class = 
                                   "text-danger" })
    </div>
</div>

Bây giờ nếu chúng ta xóa câu lệnh này:

ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", "OperatorSign", number.OperatorId);

từ phía sau của câu lệnh sau (trong bộ điều khiển của chúng tôi):

return View();

chúng ta sẽ thấy lỗi này:

Không có mục ViewData nào thuộc loại 'IEnumerable' có khóa 'OperatorId'.

* Vì vậy, hãy chắc chắn về sự tồn tại của những tuyên bố này. *


0

Đối với tôi, sự cố gây ra lỗi này đã phát sinh khi tôi đang lưu một hàng mới vào cơ sở dữ liệu, nhưng một trường trống. Trong thiết kế bảng cơ sở dữ liệu, trường đó KHÔNG ĐẦY ĐỦ. Vì vậy, khi tôi cố gắng lưu một hàng mới với giá trị null cho trường not-null, Visual Studio đã gặp lỗi này. Do đó, tôi đảm bảo rằng trường đã được gán một giá trị và sự cố đã được khắc phục.


0

Trong trường hợp của tôi, tôi thấy rằng tôi đã đặt nhầm phương thức đăng bài là riêng tư. sau khi thay đổi private thành public.

[HttpPost]
private async Task<ActionResult> OnPostRemoveForecasting(){}

thay đổi thành

[HttpPost]
public async Task<ActionResult> OnPostRemoveForecasting(){}

Bây giờ hoạt động tốt.


0

Nguyên nhân không trái với cú pháp chứ không phải là việc sử dụng các đối tượng không phù hợp. Vòng đời của các đối tượng trong ViewData, ViewBag, & View Life Cycle ngắn hơn trong phiên. Dữ liệu được xác định trong bộ giả sẽ bị mất sau một yêu cầu-phản hồi (nếu cố gắng truy cập sau một phản hồi yêu cầu, bạn sẽ nhận được ngoại lệ). Vì vậy bộ giả thích hợp để truyền dữ liệu giữa View & Controller trong khi bộ giả sau để lưu trữ dữ liệu tạm thời. Dữ liệu tạm thời nên lưu trữ trong phiên để có thể được truy cập nhiều lần.


-1

Trong trường hợp của tôi, có xung đột trong không gian tên, tôi có:

using System.Web.Mvc;

using System.Collections.Generic;

Tôi rõ ràng muốn sử dụng Mvc nên tôi đã khai báo nó là:

new System.Web.Mvc.SelectList(...)

1
Trừ khi đôi mắt của tôi lừa dối tôi, không có SelectListtrong đó System.Collections.Generic.
Erik Philips
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.