带有实体框架的MVC下拉列表

时间:2014-10-30 20:53:26

标签: asp.net-mvc entity-framework model-view-controller

我首先使用实体​​框架代码创建了一个MVC项目。我的模型只是一个收集信息的表单。

public class Application
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string MiddleInitial { get; set; }
    public string LastName { get; set; }
    public int SSN { get; set; }
    public DateTime DOB { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string State {get; set; }
    public string Zip { get; set; }
    public int HomePhone { get; set; }
    public int BusinessPhone { get; set; }
    public int MobilePhone { get; set; }

}

我的目标是创建一个包含所有状态的下拉列表,但我发现这非常困难,因为我已经通过带有视图和控制器的脚手架创建了数据库。是否有一种简单的方法可以将其与现有数据库联系起来?我几乎整整都没有运气搜索过。对模型/控制器/视图包含的内容的概述/解释将是惊人的!


更新:我创建了一个名为“State”的新模型,其属性为“Id”和“StateName”,并在数据库中创建了一些状态。在我的“应用程序”控制器中,我有以下操作:

控制器

public ActionResult Create()
    {

        ApplicationDbContext db = new ApplicationDbContext();
        this.ViewData["Id"] = new SelectList(db.States.ToList(), "Id", "StateName");
        return View();
    }

视图

@Html.DropDownList("Id")

现在问题是我收到此错误“没有类型'IEnumerable'的ViewData项具有密钥'Id'。”非常感谢帮助!

4 个答案:

答案 0 :(得分:8)

非常简单。向模型添加IEnumerable<SelectListItem>属性(在此我建议您创建一个ViewModel,它具有与Application完全相同的属性,并将以下代码作为属性包含在内)。然后,您只需构建列表并将其发送到您的视图

public IEnumerable<SelectListItem> States{ get; set; }

我假设您要从db中检索State值。以下是您将如何做到这一点:

private IEnumerable<SelectListItem> GetAllStates()
    {
        var list = new Application();
        IEnumerable<SelectListItem> slItem = from s in db.Applications
                                             select new SelectListItem
                                             {
                                                 Selected = s.Id.ToString() == "Active",
                                                 Text = s.State,
                                                 Value = s.State.ToString()
                                             };
        return slItem;
    }

然后在你的行动中做这样的事情:

var app = new Application
        {
            States = GetAllStates()
        };

        return View(app);

然后最后,在视图上使用Razor来显示像这样的下拉列表

@Html.DropDownListFor(m => m.State, Model.States, "--Select a State--")

第一个参数是要更新的模型的属性,第二个是数据列表,第三个是要显示的默认消息

希望这有帮助。

答案 1 :(得分:1)

创建一个数据层,用于检索所需内容的列表。然后使用EF获取所有状态。

//assuming you have a table of states..
var states = db.States();

状态表应该是唯一的状态列表。

var selectList = new List<SelectListItem>(); 
foreach(var thing in states){
    //if you got everything, thus the ID field for the value...   
   selectList.Add(new SelectListItem {Text =thing.State, Selected = false, Value = thing.ID);
}

确保在您的Viewmodel类中,selectlist是一个公共属性.....并设置为您在上面所做的。您还需要为后面的视图选择提供一个字符串。

StatesSelectList = selectList;
public IEnumberable<SelectListItem> StatesSelectList {get;set;}
public string SelectedState {get;set;}

在您看来,请执行以下操作:

@Html.DropDownListFor(p=>Model.SelectedState, Model.StatesSelectList)

答案 2 :(得分:0)

非常简单的代码一步一步

1)在实体框架类

var productsList = (from product in dbContext.Products
                     select new ProductDTO
                     {
                       ProductId = product.ProductId,
                       ProductName = product.ProductName,
                       }).ToList();

2)在控制器中

ViewBag.productsList = new EntityFrameWorkClass().GetBusinessSubCategoriesListForDD();

3)在视图中

@Html.DropDownList("Product_ProductId", new SelectList(ViewBag.productsList, "ProductId", "ProductName"), new { @class = "form-control" })

OR

@Html.DropDownListFor(m=>m.Product_ProductId, new SelectList(ViewBag.productsList , "ProductId", "ProductName"), new { @class = "form-control" })

答案 3 :(得分:0)

我假设有一个具有Id和StateName属性的States模型。

将列表更改为ViewData [&#34; State&#34;]以确保在POST上轻松绑定。

Id是将在POST数据中发送的值,即.. State = Id。 StateName将显示在“选择”列表中。 因此,对于您的模型,这是不正确的,因为State是一个字符串。所以需要

this.ViewData["State"] = new SelectList(db.States.ToList(), "StateName", "StateName");

然后在你看来

@Html.DropDownList("State")