【问题标题】:MVC3 DropDownList Code FirstMVC3 DropDownList 代码优先
【发布时间】:2012-04-22 18:12:21
【问题描述】:

我有以下 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; }

}

}

列表项值是在控制器中定义的,下拉列表在视图中显示良好,只是当按下提交以将值保存到数据库时我收到以下错误:

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

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

谢谢

编辑 我遵循了下面的建议并收到此错误:无法将类型 '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 的新手,谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    您正在向 Entity Framework 模型添加一个选择列表,因此 Entity Framework 正在尝试将其序列化到数据库中。不要那样做。对数据使用实体模型,对 MVC 使用视图模型。

    您声称您正在做的事情是基于一个教程,但在该教程中您没有看到它们使用实体框架模型。这是一个视图模型。

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

    【讨论】:

    • 感谢回复,那我怎么把它做成viewmodel呢?抱歉,我对 MVC 很陌生
    【解决方案2】:

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

    public string TableOption { get; set; }
    

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

    ViewBag.Tables = yourList;
    

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

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

    最后将你的模型保存在你的 post action 方法中。

    【讨论】:

    • 好的,谢谢你们的帮助,假设我是这样做的codeoverload.wordpress.com/2011/05/22/dropdown-lists-in-mvc-3 使用视图模型那么我将如何将值保存到数据库中?我通常这样做: if (ModelState.IsValid) { db.Order.Add(order); db.SaveChanges(); }
    • 您可以将 EF 模型用作视图模型。实际上,这是代码优先方法的优势之一。您在这里做错的是尝试将 SelectListItem 列表放入您的实体(餐厅类)中。这被 EF 解释为在 Restaurant 表和 SelectListItem 表之间存在一对多关系(并且您没有 SelectListItem 表)。因此,如果您想将 EF 模型用作视图模型,则必须按照我在答案中的建议进行操作。
    • 感谢您到目前为止的帮助,我已按照您的建议进行操作,但出现以下错误:无法将类型“System.Collections.Generic.List”转换为“System.Web.Mvc.SelectList”,我还更新了上面的问题以显示我目前的工作状态。你知道为什么会出现这个错误吗?
    • 我猜测 GetTableTypes 返回的是 SelectList 对象,而不是 List。您有 3 个选项: 1. 更改 GetTableTypes 方法以返回 SelectList 对象。或 2. 从您的餐厅列表中获取 SelectList: ViewBag.Tables = new SelectList(GetTableTypes(), "TableNo", "TableOption");或 3. 您可以直接在视图中执行相同操作:@Html.DropDownListFor(model => model.TableOption, new SelectList(ViewBag.Tables, "TableNo", "TableOption"))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多