我是MVC和ASP.NET的新手,我希望学习一点,所以我想尝试一些简单的应用程序来学习这些细节。
好吧,我正在尝试让一个下拉框显示一个书籍列表,它会显示书的标题,但是发布了book_id [主键]
我得到的错误是::没有带有'IEnumerable'类型的键'book_id'的ViewData项。
以下是我的看法:
<p>
<label for="book_id">Book:</label>
<%= Html.DropDownList("book_id" , (IEnumerable<SelectListItem>)ViewData["Books"]) %>
<%= Html.ValidationMessage("book_id", "*") %>
</p>
这是我控制器中的内容
// GET: /Home/Create
//This is the form creation.
[Authorize]
public ActionResult Create()
{
this.ViewData["Books"] =
new SelectList(_entities.BookSet.ToList(), "book_id", "Title");
return View();
}
//
// POST: /Home/Create
//This sends it to the DB
[AcceptVerbs(HttpVerbs.Post) , Authorize]
public ActionResult Create([Bind(Exclude="problem_id")] Problem inProblem)
{
try
{
// TODO: Add insert logic here
Models.User user = getUser(User.Identity.Name);
if (user != null)
{
inProblem.user_id = user.user_id;
}
_entities.AddToProblemSet(inProblem);
_entities.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
我的图书表格看起来像这样
book_id
title
publisher
language
isbn
我认为这是一个微不足道的新手错误;但我没有太多运气搞清楚。任何帮助都会很棒
答案 0 :(得分:4)
更简单的解决方案是将ViewData元素命名为与下拉列表相同:
this.ViewData["book_id"] = new SelectList(_entities.BookSet.ToList(), "book_id", "Title");
这将自动绑定:
<%= Html.DropDownList("book_id") %>
如果要再次显示视图,您还需要在创建的Post版本中填充ViewData [“book_id”](就像在catch中一样)。
[AcceptVerbs(HttpVerbs.Post) , Authorize]
public ActionResult Create([Bind(Exclude="problem_id")] Problem inProblem)
{
try
{
// TODO: Add insert logic here
Models.User user = getUser(User.Identity.Name);
if (user != null)
{
inProblem.user_id = user.user_id;
}
_entities.AddToProblemSet(inProblem);
_entities.SaveChanges();
return RedirectToAction("Index");
}
catch
{
this.ViewData["Books"] = new SelectList(_entities.BookSet.ToList(), "book_id", "Title");
// ViewData["book_id"] with example above.
return View();
}
}
注意:上面的this.ViewData [“Books”]应该在catch中完成 - 它只是用于演示如何丢失。