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 操作中获取 Selected Dropdown 值和文本框值

[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

完全同意 View Model 方法对您的回应(以及选择它有用的我)。但是,如果您不想切换,但保持原样,我敢打赌您的答案就在这篇文章中

希望这对您有所帮助。

于 2012-08-13T19:35:02.000 回答