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

dc9*_*922 6 model-view-controller asp.net-mvc entity-framework

我首先使用实体​​框架代码创建了一个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; }
Run Code Online (Sandbox Code Playgroud)

}

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


更新:我创建了一个名为"State"的新模型,其属性为"Id"和"StateName",并在数据库中创建了一些状态.在我的"应用程序"控制器里面的Create action方法我有:

调节器

public ActionResult Create()
    {

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

视图

@Html.DropDownList("Id")
Run Code Online (Sandbox Code Playgroud)

现在的问题是我收到这个错误"没有类型为'IEnumerable'的ViewData项具有密钥'Id'." 非常感谢帮助!

Abd*_*ulG 9

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

public IEnumerable<SelectListItem> States{ get; set; }
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

        return View(app);
Run Code Online (Sandbox Code Playgroud)

最后,在视图上使用Razor来显示这样的Dropdown列表

@Html.DropDownListFor(m => m.State, Model.States, "--Select a State--")
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助.


Joh*_*ers 1

创建一个数据层来检索您想要的列表。然后使用EF获取所有状态。

//assuming you have a table of states..
var states = db.States();
Run Code Online (Sandbox Code Playgroud)

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

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
                      });
}
Run Code Online (Sandbox Code Playgroud)

确保在您的视图模型类中,选择列表是公共属性......并设置为您上面所做的操作。您还需要为视图选择回发提供一个字符串。

StatesSelectList = selectList;
public IEnumerable<SelectListItem> StatesSelectList { get; set; }
public string SelectedState { get; set; }
Run Code Online (Sandbox Code Playgroud)

在你看来,这样做:

@Html.DropDownListFor(p => Model.SelectedState, Model.StatesSelectList)
Run Code Online (Sandbox Code Playgroud)