2

私の見解では、データベース データを入力する DropDownList があります。しかし、実行すると、よくわからないエラーが表示されます。

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

これを行う方法はわかりませんが、さまざまな解決策を調べましたが、これが私のやり方です:

データベースからデータを取得する関数:

public IEnumerable<SelectListItem> getBagelTypes()
    {
        return (from t in Db.BagelType.AsEnumerable()
                select new SelectListItem
                {
                    Text = t.Name,
                    Value = t.BagelTypeId.ToString(),
                }).AsEnumerable();             
    }

コントローラ:

public ActionResult Index()
    {
        ViewData["LstBagels"] = DbO.getBagels();
        TempData["LstTypeOptions"] = DbO.getBagelTypes();
        Session["OrderCount"] = OrderCount;

        return View();
    }

意見:

@model BestelBagels.Models.Bagel
@{
ViewBag.Title = "Home Page";

var LstBagels = ViewData["LstBagels"] as List<BestelBagels.Models.Bagel>;
var LstTypeOptions = TempData["LstTypeOptions"] as IEnumerable<SelectList>;
var OrderCount = Session["OrderCount"];
}

@Html.DropDownList("DdlBagTypes", (SelectList)LstTypeOptions)
4

1 に答える 1

3

TempData の代わりに ViewData を使用してデータをビューに渡します。

ViewData["LstTypeOptions"] = DbO.getBagelTypes();

そしてあなたのビューの中で:

var LstTypeOptions = ViewData["LstTypeOptions"] as IEnumerable<SelectListItem>;

その後:

@Html.DropDownList("DdlBagTypes", LstTypeOptions)

また、関数が返す正しい型がキャストされIEnumerable<SelectListItem>ていることにも注意してください。getBagelTypesあなたの例では、TempData 内に保存したものではないため、IEnumerable<SelectList>明らかに返されるものにキャストしようとしていました。null

しかし、個人的には、この ViewData のものを捨てて、ビュー モデルを導入します。

public class MyViewModel
{
    public string SelectedOption { get; set; }
    public IEnumerable<SelectListItem> LstTypeOptions { get; set; }

    public string SelectedBagel { get; set; }
    public IEnumerable<SelectListItem> LstBagels { get; set; }

    public int OrderCount { get; set; }
}

コントローラーアクションに入力してビューに渡します。

public ActionResult Index()
{
    var model = new MyViewModel();
    model.LstTypeOptions = DbO.getBagelTypes();
    model.LstBagels = DbO.getBagels();
    model.OrderCount = OrderCount;

    return View(model);
}

最後に、ビュー モデルに強く型付けされたビューを作成し、強く型付けされたヘルパーを使用します。

@model MyViewModel
...
@Html.DropDownListFor(x => x.SelectedOption, Model.LstTypeOptions)
@Html.DropDownListFor(x => x.SelectedBagel, Model.LstBagels)
...
<div>You have a total of @Html.DisplayFor(x => x.OrderCount) orders</div>
于 2013-08-23T14:08:13.030 に答える