[解決済み] キー 'XXX' を持つ ViewData アイテムは 'System.Int32' 型ですが、'IEnumerable<SelectListItem>' 型である必要があります。
質問
次のようなビューモデルがあります。
public class ProjectVM
{
....
[Display(Name = "Category")]
[Required(ErrorMessage = "Please select a category")]
public int CategoryID { get; set; }
public IEnumerable<SelectListItem> CategoryList { get; set; }
....
}
と、以下のコントローラメソッドで、新しいProjectを作成し、そのProjectに
Category
public ActionResult Create()
{
ProjectVM model = new ProjectVM
{
CategoryList = new SelectList(db.Categories, "ID", "Name")
}
return View(model);
}
public ActionResult Create(ProjectVM model)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Save and redirect
}
そして、ビューの中で
@model ProjectVM
....
@using (Html.BeginForm())
{
....
@Html.LabelFor(m => m.CategoryID)
@Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "-Please select-")
@Html.ValidationMessageFor(m => m.CategoryID)
....
<input type="submit" value="Create" />
}
ビューは正しく表示されますが、フォームを送信するときに次のようなエラーメッセージが表示されます。
InvalidOperationExceptionです。キー 'CategoryID' を持つ ViewData アイテムは 'System.Int32' 型ですが、 'IEnumerable<SelectListItem>' 型である必要があります。
を使用しても同じエラーが発生します。
@Html.DropDownList()
メソッドを使用してSelectListを渡すと、同じエラーが発生します。
ViewBag
または
ViewData
.
どのように解決するのですか?
このエラーは
CategoryList
の値が null であることを意味します (その結果
DropDownListFor()
メソッドは最初のパラメーターの型が
IEnumerable<SelectListItem>
).
の各プロパティに対する入力を生成しているわけではありません。
SelectListItem
で
CategoryList
(の値はありません(そうすべきです)。
SelectList
の値はコントローラのメソッドにポストされないので
model.CategoryList
は POST メソッドで
null
. ビューを返す場合は、最初に
CategoryList
の値を再割り当てしなければなりません。
public ActionResult Create(ProjectVM model)
{
if (!ModelState.IsValid)
{
model.CategoryList = new SelectList(db.Categories, "ID", "Name"); // add this
return View(model);
}
// Save and redirect
}
内部構造を説明するために(ソースコードは をご覧ください。 )
の各オーバーロードは
DropDownList()
と
DropDownListFor()
は最終的に以下のメソッドを呼び出します。
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, ModelMetadata metadata,
string optionLabel, string name, IEnumerable<SelectListItem> selectList, bool allowMultiple,
IDictionary<string, object> htmlAttributes)
で、これは
selectList
(の第二パラメータ)。
@Html.DropDownListFor()
) は
null
// 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;
}
を呼び出し、さらに
private static IEnumerable<SelectListItem> GetSelectData(this HtmlHelper htmlHelper, string name)
の最初のパラメータを評価します。
@Html.DropDownListFor()
を評価します (この場合
CategoryID
)
....
o = htmlHelper.ViewData.Eval(name);
....
IEnumerable<SelectListItem> selectList = o as IEnumerable<SelectListItem>;
if (selectList == null)
{
throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture,
MvcResources.HtmlHelper_WrongSelectDataType,
name, o.GetType().FullName, "IEnumerable<SelectListItem>"));
}
なぜなら、プロパティ
CategoryID
はtypeof
int
にキャストすることはできません。
IEnumerable<SelectListItem>
にキャストできず、例外が投げられます (これは
MvcResources.resx
ファイルで定義されています)。
<data name="HtmlHelper_WrongSelectDataType" xml:space="preserve">
<value>The ViewData item that has the key '{0}' is of type '{1}' but must be of type '{2}'.</value>
</data>
関連
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】C#で四捨五入する方法
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] キー 'MY KEY' を持つ ViewData アイテムは 'System.String' 型ですが、'IEnumerable<SelectListItem>' 型である必要があります。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#で四捨五入する方法
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] 関数を終了するには?
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する