2

コントローラーでSelectListItemsのリストを作成し、これをViewDataに保存します。ビューで ViewData を読み取ると、型が正しくないというエラーが表示されます。タイプを手動でキャストすると機能しますが、これは自動的に行われるようです。誰か説明できますか?

コントローラー

enum TitleEnum { Mr, Ms, Mrs, Dr };
var titles = new List<SelectListItem>();
foreach(var t in Enum.GetValues(typeof(TitleEnum)))
  titles.Add(new SelectListItem() 
    { Value = t.ToString(), Text = t.ToString() });

ViewData["TitleList"] = titles;

ビュー:

// Doesn't work
Html.DropDownListFor(x => x.Title, ViewData["TitleList"])

// This Works
Html.DropDownListFor(x => x.Title, (List<SelectListItem>) ViewData["TitleList"])
4

5 に答える 5

3

であるためViewDataですDictionary<string, Object>。複数のタイプのオブジェクトをキー付きコレクションに格納するには、他にどのような方法がありますか? キャストせずに取得したものViewDataはすべて、コンパイラによって base として扱われObjectます。

于 2010-06-12T00:30:29.490 に答える
1

私の記憶が正しければ、ViewData はオブジェクトの配列/コレクションです。これが、追加のキャストが必要な理由です。

于 2010-06-11T23:11:14.107 に答える
0

どうやら、コンパイラは object 型のオブジェクトから別の型へのキャストを自動的には実行しません。ViewData からの結果は、コンパイル時にオブジェクト型であると予想されます。例は次のとおりです。

// This Fails
object obj = new List<SelectListItem>();
Html.DropDownListFor(x => x.Title, obj);

// This Works
var obj2 = new List<SelectListItem>();
Html.DropDownListFor(x => x.Title, obj2);
于 2010-06-12T00:37:20.487 に答える
0

これは、「静的型付け」と呼ばれる機能によるものです。好きな人もいれば、嫌いな人もいます。

于 2010-06-12T00:38:47.320 に答える
-1

変更したらどうなりますか

ViewData["TitleList"] = titles;

ViewData["TitleList"] = new SelectListItem() 
    { Value = t.ToString(), Text = t.ToString() };

そしてもう一度試してみてください:

Html.DropDownListFor(x => x.Title, ViewData["TitleList"])

これがうまくいけば、私はFemarefに同意するでしょう....しかし良い質問です。

于 2010-06-11T23:39:04.860 に答える