MVC - 没有带有'IEnumerable <selectlistitem>'类型键的Viewdata项目</selectlistitem>

时间:2010-01-25 01:20:31

标签: c# asp.net-mvc

我是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

我认为这是一个微不足道的新手错误;但我没有太多运气搞清楚。任何帮助都会很棒

1 个答案:

答案 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中完成 - 它只是用于演示如何丢失。