0

そのエラーがあります

The ViewData item that has the key 'BookAttributesDDL' is of type 'System.String' but must be of type 'IEnumerable<SelectListItem>'.

そのコードで:

@Html.DropDownList("BookAttributesDDL", Model.BookAttributes_Items)

しかし、これは!Model.BookAttributes_Itemsのタイプです。IEnumerable<SelectListItem>どうしたの ?

ViewData.Keysイミディエイト ウィンドウのプロパティ:

ViewData.Keys
Count = 2
    [0]: "FCoookie"
    [1]: "Title"
4

2 に答える 2

1

ViewBagやViewDataなどの動的変数は避けてください。それはあなたのコードを読めなくし、それが成長するにつれて将来維持するのに苦痛を与えるでしょう。ViewBagはマジックストリングのようなものです!

ViewModelアプローチに切り替えます。

たとえば、本を作成するためのビューを作成する場合は、次のようにViewmodel単なるクラスです)を作成します。

public class BookViewModel
{
  public int BookId { set;get;}
  public string BookName {set;get;}
  public IEnumerable<SelectListItem> Attributes{ get; set; }
  public int SelectedAttribute{ get; set; }

}

GETアクションで、このクラスのオブジェクトを作成し、BookAttribbutesプロパティをドロップダウンアイテムに設定して、このViewModelオブジェクトをビューに渡します。

public ActionResult Create()
{
  BookViewModel vm=new BookViewModel();
  //The below code is hardcoded for demo. you mat replace with DB data.
  vm.Attributes=new[]
  {
    new SelectListItem { Value = "1", Text = "F Cookie" },
    new SelectListItem { Value = "2", Text = "Title" },
  }
  return View(vm);
}

ここで、このViewModelクラスに強く型付けされたビューを作成します

@model BookViewModel
@using(Html.BeginForm())
{
 @Html.TextBoxFor(x=>x.BookName)
 @Html.DropDownListFor(x => x.SelectedAttribute, 
      new SelectList(Model.Attributes, "Value", "Text"), "Select Attribute")

 <input type="submit" value="Save" />
}

これで、ViewModelの対応するプロパティにアクセスして、HttpPostアクションで選択されたドロップダウン値とテキストボックス値を取得できます。

[HttpPost]
public ActionResult Create(BookViewModel model)
{
  if(ModelState.IsValid)
  { 
    //check for model.BookName / model.SelectedAttribute
  }
  //validation failed.TO DO : reload dropdown here
  return View(model);
} 
于 2012-08-13T18:06:32.333 に答える
0

あなたへのビューモデルアプローチの応答に完全に同意します(そしてそれを有用であると選択したのは私です)。ただし、切り替えたくないがそのままにしておく場合は、この記事に答えがあるに違いありません。

これがお役に立てば幸いです。

于 2012-08-13T19:35:02.000 に答える