web-dev-qa-db-ja.com

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

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

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

コントローラー

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

表示

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

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

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

84
Jimbo

わかりましたので、答えはこの問題に関する他のいくつかの投稿から派生したものであり、それは次のとおりです。

ViewDataSelectListと同じ名前のDropDownList、つまり「submarket_0」が含まれている場合、HtmlヘルパーはDropDownListにそのデータを自動的に入力しますif 2番目のパラメーターは指定しません。この場合、これはソースSelectListです。

私のエラーで何が起こったのですか:

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

間違っている場合は修正してください

76
Jimbo

古い質問ですが、問題の別の説明があります。ビューを厳密に入力し、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にその名前のオブジェクトがない場合はエラーをスローします。

27
hawkke

同じエラーが発生しました。問題はエラーテキストはわかりにくいであると思います。これは、誤ったキー名を与えるためです。

あなたの場合、「キー「Submarkets」を持つタイプ 'IEnumerable'のViewDataアイテムはありません」と言う必要があります。

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

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

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

お役に立てれば!

15
Peto

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

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

名前空間を確認します。

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

3
MovGP0

これも大丈夫です。例えば:
==>「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アイテムはありません。

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

1
Morteza

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

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

への変更

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

現在は正常に動作します。

0
Mohammed Sabbir

私にとっては、データベースに新しい行を保存しているときにこのエラーを引き起こす問題が発生しましたが、フィールドがnullでした。データベーステーブルの設計では、そのフィールドはNOT NULLです。そのため、null以外のフィールドにnull値を持つ新しい行を保存しようとすると、Visual Studioはこのエラーをスローしました。したがって、フィールドに値が割り当てられ、問題が修正されたことを確認しました。

0
Thuy