MVC3 DropDownList代码优先

时间:2012-04-22 18:12:22

标签: visual-studio-2010 asp.net-mvc-3 model drop-down-menu ef-code-first

我有以下MVC3模型:

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; }

}

}

List项值在控制器中定义,并且在按下提交时将下拉列表显示在视图中,以便将值保存到数据库中我得到以下错误:

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

它基于本教程http://codeoverload.wordpress.com/2011/05/22/dropdown-lists-in-mvc-3/

由于

EDIT 我已经按照下面的建议得到了这个错误:无法将类型'System.Collections.Generic.List'转换为'System.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; }
}
}

这是我的控制者:

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;
        }
}
}

任何帮助都是适用的,因为我对MVC3很新,谢谢!

2 个答案:

答案 0 :(得分:0)

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

您正在向Entity Framework模型添加选择列表,因此Entity Framework正在尝试将其序列化到数据库。不要那样做。使用实体模型进行数据,使用View Models for MVC。

你声称自己在做什么是基于一个教程,但在那个教程中你没有看到它们使用Entity Framework模型。这是一个视图模型。

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

答案 1 :(得分:0)

Mystere Man是对的。我猜你需要将下拉列表中的选定值保存到数据库中。如果是这样,请通过以下方式更改TableOption属性:

public string TableOption { get; set; }

然后,在你的控制器中使用ViewBag将SelectList对象传递给你的视图,如Mystery所说:

ViewBag.Tables = yourList;

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

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

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