ASP.NET MVC 2.0 R2で新しく強く型付けされたHtml.DropDownListForヘルパーを使用する方法について完全に迷って混乱しています
私が書いているビューでは:
<%= Html.DropDownListFor(m => m.ParentCategory, new SelectList(Model.Categories, "CategoryId", "Name", Model.ParentCategory), "[ None ]")%>
<%= Html.ValidationMessageFor(m => m.ParentCategory)%>
したがって、私のModelオブジェクトは次のとおりです。
public class CategoryForm : FormModelBase
{
public CategoryForm()
{
Categories = new List<Category>();
Categories.Add(new CategoryForm.Category() {
CategoryId = 1,
Name = "CPUs" });
Categories.Add(new CategoryForm.Category() {
CategoryId = 2,
Name = "Memory" });
Categories.Add(new CategoryForm.Category() {
CategoryId = 3,
Name = "Hard drives" });
}
// ...other props, snip... //
public Category ParentCategory { get; set; }
public IList<Category> Categories { get; protected set; }
public class Category
{
public int? CategoryId { get; set; }
public string Name { get; set; }
}
}
問題は、ドロップダウンリストからアイテム(最初のアイテムなど)を選択すると、次のValidationMessageForエラーが発生することです。「値 '1'は無効です。」
そこで、ビューを...に変更します.
<%= Html.DropDownListFor(m => m.ParentCategory.**CategoryId**,
new SelectList .../ snip ) %>
これで動作します。 ViewModelのParentCategoryプロパティに正しい「CategoryId」が設定されていますが、「Name」はNULLです。強く型付けされた 'Category'オブジェクトの代わりに、ParentCategoryプロパティにnullable intを持たせた方が良いでしょうか?
私も同じ問題を経験していました。
たとえば、アクションをデバッグし、ModelState.Values [1] .Errors [0] .Exceptionを調べると、次のように表示されます。
{"タイプ 'System.String'からタイプ 'System.Collections.Generic.KeyValuePair`2 [[System.String、mscorlib、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]、[System。 Int64、mscorlib、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]] 'は、これらの型の間で変換できる型コンバーターがないため失敗しました。 "} System.Exception {System.InvalidOperationException}
私のシナリオでは、SelectListは辞書から作成され、ビューでこれを使用します。
<%=Html.DropDownListFor(x => x.MyDictionary,
new SelectList(
Model.MyDictionary,
"Value",
"Key")) %>
変更したとき:
<%=Html.DropDownListFor(x => x.MyDictionary.Keys, // <-- changed to .Keys
new SelectList(
Model.MyDictionary,
"Value",
"Key")) %>
問題なく機能しました。
ありがとうございました。
<%= Html.DropDownListFor(m => m.ParentCategory,
new SelectList(
Model.Categories,
"CategoryId",
"Name",
Model.ParentCategory),
"[ None ]")%>
SelectList
の最後のパラメーターとしてModel.ParentCategory.CategoryId
を使用し、[None]
パラメーターを削除しようとしましたか?
私は取り除くだろう
public Category ParentCategory { get; set; }
そして作る
public int? CategoryId { get; set; }
代わりに。おそらく、とにかくIdのみが必要です-Idをキーとして使用して、実際のオブジェクトを常に検索できます(リストのlinq/lambdaを使用して)。
ビューには次の2つがあります。
<%= Html.DropDownListFor(m => m.CategoryId,
new SelectList(
Model.Categories,
"CategoryId",
"Name",
Model.CategoryId),
"[ None ]")%>
<%= Html.ValidationMessageFor(m => m.CategoryId)%>
SelectModelがViewModelでnullの場合、上記のエラーも受け取りました
SelectListが設定されていることを確認してください