キー 'MY KEY' を持つ ViewData 項目は 'System.String' 型ですが、 'IEnumerable' 型である必要があります。 ' 質問する

キー 'MY KEY' を持つ ViewData 項目は 'System.String' 型ですが、 'IEnumerable' 型である必要があります。 ' 質問する

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

2 行目にtype の変数を宣言しているのです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);
    }
}

ありがとう。

ベストアンサー1

私も同じ問題を抱えていましたが、ついに答えを見つけました...

問題は、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);
    }
}

この質問は非常に古いことは承知していますが、今日同じ問題でここに来たので、他の人は後でここに来るかもしれません...

おすすめ記事