0

我有以下MVC3模型:MVC3 DropDownList的代码首先

public class Dine 
{ 
    [Key] 
    [Display(Name = "Table Number")] 
    public string TableNumber { get; set; } 

    public List<SelectListItem> TableSelections { get; set; } 


    [Display(Name = "Table Date")] 
    [Required(ErrorMessage = "Please enter a date")] 
    public DateTime Date { get; set; } 

} 

}

值在控制器中定义,并在短短当提交被压到视图显示在下拉列表精细的列表项保存到数据库的值我得到以下错误:

有谁知道如何解决这个问题?

正是基于这个教程http://codeoverload.wordpress.com/2011/05/22/dropdown-lists-in-mvc-3/

感谢

编辑 我遵循了下面的建议,并得到这个错误:无法键入“System.Collections.Generic.List”转换成“系统。 Web.Mvc.SelectList”

这是我在我的观点:

<td>@Html.DropDownListFor(model => model.TableSelection, (SelectList)ViewBag.Tables)</td> 

这是我在我的模型

public class Dine 
{ 
    [Key] 
    [Display(Name = "Table No")] 
    public int TableNo { get; set; } 

    public string TableOption { get; set; } 

    [Display(Name = "Table Date")] 
    [Required(ErrorMessage = "Please enter a date")] 
    public DateTime Date { get; set; } 
} 
} 

这是我的控制器:因为我是很新的MVC3谢谢

public class RestaurantController : Controller 
{ 
    TheDatabaseEntities db = new TheDatabaseEntities(); 
    // 
    // GET: /Dine/ 

    public ActionResult Index() 
    { 
     ViewBag.Tables = GetTableOptions(); 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(Restaurant model) 
    { 
     if (ModelState.IsValid) 
     { 

      return RedirectToAction("AddBookingComplete"); 
     } 
     ViewBag.Tables = GetTableOptions(); 

     return View(model); 
    } 
    public ActionResult BookingComplete() 
    { 
     return View(); 
    } 

    private List<Restaurant> GetTableOptions() 
    { 
     List<Restaurant> Tables = new List<Restaurant>(); 
     Table.Add(new Dine() { TableNumber = 1, TableSelection = "Table 1" }); 
     Table.Add(new Dine() { TableNumber = 2, TableOSelection = "Table" }); 
     Table.Add(new Dine() { TableNumber = 3, TableSelection = "Table" }); 
     Tables.Add(new Dine() { TableNumber = 4, TableSelection = "Table" }); 

     return Table; 
     } 
} 
} 

任何帮助appriciated!

回答

0

不,您没有MVC3模型。你有一个你试图用作MVC3模型的实体框架模型。这不是一个微妙的区别。

您正在为您的实体框架模型添加一个选择列表,因此实体框架试图将其序列化到数据库。不要这样做。使用数据的实体模型,使用MVC的视图模型。

你声称你正在做的是基于一个教程,但在那个教程中没有任何地方使用实体框架模型来看它们。这是一个视图模型。

如果你坚持在你的视图中使用你的EF模型(尽管最佳实践说不这样做),那么你需要通过ViewData(或ViewBag)传递你的SelectList,而不是在你的模型中。

+0

感谢您的回复,我该如何将它变成视图模型呢?对不起,我对MVC – user1302054 2012-04-22 20:02:51

+0

@ user1302054很新 - 你不这样做。这就是要点 – 2012-04-22 21:41:30

0

Mystere Man是对的。我猜你需要将选定的值从下拉列表保存到数据库。如果是这样,TableOption财产这样的改变:

public string TableOption { get; set; } 

然后,在你CONTROLER通过的SelectList对象使用ViewBag作为神秘您的观点说:

ViewBag.Tables = yourList; 

并且在视图中使用的下拉帮手填充选择并绑定到模型:

@Html.DropDownListFor(model => model.TableOption, new SelectList(ViewBag.Tables, "TableNo","TableOption")) 

最后将您的模型保存在您的发布操作方法中。

+0

好的谢谢你们的帮助,假设我这样做了http://codeoverload.wordpress.com/2011/05/22/dropdown-lists-in-mvc-3/使用viewmodel然后如何我会将值保存到数据库吗?我通常这样做:if(ModelState.IsValid){db.Order.Add(order); db.SaveChanges(); } – user1302054 2012-04-22 23:17:46

+0

您可以将您的EF模型用作View模型。实际上,这是代码优先方法的优势之一。你在做什么错在这里试图把SelectListItem列表放到你的实体(餐厅类)中。这由EF解释,就好像您在Restaurant表和SelectListItem表之间存在一对多关系(并且您没有SelectListItem表)。所以,如果你想用你的EF模型作为View模型,你必须按照我的建议来回答。 – fcaldera 2012-04-23 13:41:38

+0

感谢您的帮助到目前为止,我已按照您的建议,但得到以下错误:无法将类型'System.Collections.Generic.List'转换为'System.Web.Mvc.SelectList',我也更新了上面的问题显示我目前的工作状态。你知道这个错误发生的原因吗? – user1302054 2012-04-23 21:37:27