1. ホーム
  2. asp.net-mvc

[解決済み] キー 'MY KEY' を持つ ViewData アイテムは 'System.String' 型ですが、'IEnumerable<SelectListItem>' 型である必要があります。

2022-05-12 08:20:56

質問

ASP.NET MVC 2 を使用して、Linq-2-SQL でマッピングされたデータベースからドロップダウンリストにデータを入力しようとしていますが、このエラーが発生します。

型の変数を宣言しているので、私はとても混乱しています。 IEnumerable<SelectListItem> を宣言しているのですが、エラーが出ているため、そうではないと思われます。とても簡単なことだと思うのですが、苦戦しています。どんな助けでも感謝します。

以下は私のコントローラの興味深い部分です。

public ActionResult Create()
{
    var db = new DB();
    IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
        b => new SelectListItem { Value = b.basetype, Text = b.basetype });
    ViewData["basetype"] = basetypes;
    return View();
}

そして、ここからは私の見解の面白いところです。

<div class="editor-label">
   <%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
   <%: Html.DropDownList("basetype") %>
   <%: Html.ValidationMessageFor(model => model.basetype) %>
</div>

フォームを送信する際のPOSTアクションは次のとおりです。

// POST: /Meals/Create
[HttpPost]
public ActionResult Create(Meal meal)
{
    if (ModelState.IsValid)
    {
        try
        {
            // TODO: Add insert logic here
            var db = new DB();
            db.Meals.InsertOnSubmit(meal);
            db.SubmitChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View(meal);
        }
    }
    else
    {
        return View(meal);
    }
}

ありがとうございます。

どのように解決するのですか?

私も同じ問題を抱えていましたが、ついに答えを得ました。

問題は、フォームを送信した後のPOSTアクションで、ModelStateが有効でない、またはtry/catchでエラーをキャッチしているため、Viewが返されることです。しかし、このときViewには ViewData["basetype"] が正しく設定されていません。

もう一度入力する必要があります。おそらく前に使ったのと同じコードで、これを繰り返してください。

var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
    b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;

の前に return View(meal) の中に [HttpPost] メソッドを使用します。

は、まさにこれで問題が解決します。

[HttpPost]
public ActionResult Create(Meal meal)
{
    if (ModelState.IsValid)
    {
        try
        {
            // TODO: Add insert logic here
            var db = new DB();
            db.Meals.InsertOnSubmit(meal);
            db.SubmitChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            var db = new DB();
            IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
               b => new SelectListItem { Value = b.basetype, Text = b.basetype });
            ViewData["basetype"] = basetypes;
            return View(meal);
        }
    }
    else
    {
        var db = new DB();
        IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
            b => new SelectListItem { Value = b.basetype, Text = b.basetype });
        ViewData["basetype"] = basetypes;
        return View(meal);
    }
}

私はこの質問が非常に古いことを知っているが、私は同じ問題で今日ここに来たので、他の人は後でここに来ることができる...