キー「xxx」を持つタイプ「IEnumerable <SelectListItem>」のViewDataアイテムはありません。


87

Stack Overflowにはこれに関する投稿がいくつかありますが、私の現在の状況で問題を解決しているように見える答えはありません。

テーブルのあるページがあり、各行にはいくつかのテキストフィールドとドロップダウンがあります。すべてのドロップダウンで同じSelectListデータを使用する必要があるため、次のように設定しました。

コントローラ

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

見る

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

私は多くの場所でこの設定を正確に使用しましたが、この特定のビューで何らかの理由でエラーが発生します:

キー「submarket_0」を持つタイプ「IEnumerable」のViewDataアイテムはありません。


1
これを試しましたか?<%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %>DropDownListはIEnumerable<SelectListItem>。を取ります。
LukLed 2010年

@ LukLed-それは確かに私が最終的にエラーの原因を見つけた方法です:)そして他のいくつかの投稿からの情報!ありがとう
Jimbo

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

今日これに遭遇し、@ jonathansewellからの以下の発見によると、私のDropDownListヘルパーの2番目の引数がnullであることがわかりました。
ケンパーマー

回答:


79

さて、答えはこの問題に関する他のいくつかの投稿から導き出されました。それは次のとおりです。

に「submarket_0」と同じ名前のViewDataが含まれている場合、2番目のパラメータ(この場合はソースSelectList)を指定しないと、Htmlヘルパーが自動的にそのデータを入力します。SelectListDropDownListDropDownList

私のエラーで起こったことは:

ドロップダウンリストを含むテーブルが部分ビューにあり、ViewDataが変更され、SelectList参照したIが含まれなくなったため、HtmlHelper(エラーをスローする代わりに)ViewData(GRRRR!)で「submarket_0」というSelectListを見つけようとしました。 !!)それでも見つけることができず、エラーをスローしました:)

私が間違っている場合は私を訂正してください


104
ドロップダウンリストのSelectListItemsのコレクションがnullであったため、このエラーが発生しました。これは、私が考えていたのと同じ問題です。
Jonathan Sewell 2011年

6
この問題に直面している他の人の場合は、ドロップダウンリストを一時的にnullチェックでラップします(例:@if(ViewData ["Submarkets"]!= null))。その後、エラーをスローせずに(ドロップダウンリストなしで)ビューがレンダリングされる場合は、問題を特定したことになります。この場合、「データ項目が表示されません」というエラーは非常に誤解を招く可能性があります。
GDB 2014年

を使用してこれに遭遇しましたAjax.ActionLink。Ajax呼び出しを含むにSelectList Getを追加するだけActionMethodです。
悪臭を放つ2014年

うん!コントローラからViewDataに渡すリストの名前を変更しましたが、ビューでは変更していませんでした。それは本当にひどく紛らわしいエラーメッセージです!
neminem 2014

1
@JonathanSewellありがとう、ありがとう、ありがとう!これが私の正確な問題でした。
johnw182 2015

29

古い質問ですが、ここに問題の別の説明があります。強く型付けされたビューがあり、ViewDataを使用してドロップダウンリストを作成していない場合でも、このエラーが発生します。エラーの理由は、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;
}

したがって、次のようなものがある場合:

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

またModel.DropDownData、nullの場合、MVCはViewDataで名前の付いたものMyListを探し、その名前のオブジェクトがViewDataにない場合はエラーをスローします。


1
こんにちは、これも私の問題です。リストがnullの場合どうすればよいですか?何か提案できますか
トランスフォーマー

4
@transformer最も簡単な方法は、Model.DropDownDataをnullではなく空のリストに設定することです。それが不可能な場合は、かみそりのマークアップを変更して、リストがnullかどうかを確認し、nullの場合は、空の選択リストをレンダリングできます。
hawkke 2017年

15

同じエラーが発生しました。問題は、誤ったキー名が付けられているため、エラーテキストが混乱しいることだと思います。

あなたの場合、「キー「サブマーケット」を持つタイプ「IEnumerable」のViewDataアイテムはありません」と表示されます。

私のエラーはビューコード(あなたの「サブマーケット」)のスペルミスでしたが、エラーテキストは私を夢中にさせました。

私がそうであったように、このエラーを探している人々に、問題はIENumerableが見つからないことですが、それを探すことになっている変数(この場合は「サブマーケット」)であると言いたいので、この回答を投稿します。エラーが表示されたもの( "submarket_0")にはありません

受け入れられた答えは非常に興味深いですが、あなたが言ったように、2番目のパラメーターを指定しない場合は規則が適用されます。この場合は指定されていますが、変数が見つかりませんでした(あなたの場合、viewdataにそれがなかったため、私の場合はvar名のスペルを間違えました)

お役に立てれば!


9

問題は、送信ボタンのクリック時にポストバックが発生するためです。したがって、送信時にデータを投稿している間、View()を返す前にもう一度クリックしてください

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

3

名前空間を確認してください。

あなたは割り当てることができますSystem.Web.Webpages.Html.SelectListItemを代わりに、コントローラにSystem.Web.Mvc.SelectListItem


1

これもOKです。例:
==>「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();
}

==>ビューファイル(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>

このステートメントを削除すると、次のようになります。

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

次のステートメントの後ろから(コントローラー内):

return View();

このエラーが表示されます:

キー「OperatorId」を持つタイプ「IEnumerable」のViewDataアイテムはありません。

*したがって、これらのステートメントが存在することを確認してください。*


0

私の場合、このエラーの原因となった問題は、新しい行をデータベースに保存しているときに発生しましたが、フィールドがnullでした。データベーステーブルの設計では、そのフィールドはNULLではありません。そのため、null以外のフィールドにnull値を使用して新しい行を保存しようとすると、VisualStudioはこのエラーをスローしました。したがって、フィールドに値が割り当てられていることを確認し、問題を修正しました。


0

私の場合、postメソッドを誤ってプライベートに設定してしまったことがわかりました。プライベートからパブリックに変更した後。

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

への変更

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

これで正常に動作します。


0

原因は、オブジェクトの不適切な使用ではなく、構文に反するものではありません。ViewData、ViewBag、およびViewライフサイクルのオブジェクトのライフサイクルは、セッションよりも短くなります。前者で定義されたデータは、要求/応答の後に失われます(要求-応答の後にアクセスしようとすると、例外が発生します)。したがって、前者はViewとController間でデータを渡すのに適しており、後者は一時データを格納するのに適しています。一時データは、何度もアクセスできるようにセッションに保存する必要があります。


-1

私の場合、名前空間に競合がありました。

using System.Web.Mvc;

そして

using System.Collections.Generic;

私は明示的にMvcを使用したいので、次のように宣言しました:

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

1
私の目が私を欺くない限り、何もありませんSelectListではSystem.Collections.Generic
Erik Philips
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.