我首先使用实体框架代码创建了一个 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")
现在的问题是我收到此错误“没有具有键“Id”的“IEnumerable”类型的 ViewData 项。”非常感谢帮助!
非常简单。将
IEnumerable<SelectListItem>
属性添加到您的模型中(这里我建议您创建一个具有与 Application
完全相同的属性的 ViewModel,并包含以下代码作为属性)。然后您只需构建列表并将其发送到您的视图
public IEnumerable<SelectListItem> States{ get; set; }
我假设您想从数据库中检索
State
值。以下是您将如何做到的:
private IEnumerable<SelectListItem> GetAllStates()
{
IEnumerable<SelectListItem> list = from s in db.Applications
select new SelectListItem
{
Selected = false,
Text = s.State,
Value = s.State
};
return list;
}
或者这个...
private IEnumerable<SelectListItem> GetAllStates()
{
IEnumerable<SelectListItem> list = db.Applications.Select(s => new SelectListItem
{
Selected = false,
Text = s.State,
Value = s.State
});
return list;
}
然后在你的行动中做这样的事情:
var app = new Application
{
States = GetAllStates()
};
return View(app);
最后,在视图上使用 Razor 来显示下拉列表,如下所示
@Html.DropDownListFor(m => m.State, Model.States, "--Select a State--")
第一个参数是要更新的模型的属性,第二个参数是数据列表,第三个参数是要显示的默认消息
希望这有帮助。
创建一个数据层来检索您想要的列表。然后使用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
});
}
确保在您的视图模型类中 selectlist 是公共属性......并设置为您上面所做的操作。您还需要为视图选择回发提供一个字符串。
StatesSelectList = selectList;
public IEnumerable<SelectListItem> StatesSelectList { get; set; }
public string SelectedState { get; set; }
您认为,请这样做:
@Html.DropDownListFor(p => Model.SelectedState, Model.StatesSelectList)
非常简单的代码一步一步
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" })
或
@Html.DropDownListFor(m=>m.Product_ProductId, new SelectList(ViewBag.productsList , "ProductId", "ProductName"), new { @class = "form-control" })
我假设有一个包含 Id 和 StateName 属性的 States 模型。
将列表更改为 ViewData["State"] 以确保在 POST 上轻松绑定。
Id 是将在 POST 数据中发送的值,即.. State = Id。 StateName 是将显示在“选择”列表中的内容。 因此对于您的模型来说这是不正确的,因为 State 是一个字符串。所以需要是
this.ViewData["State"] = new SelectList(db.States.ToList(), "StateName", "StateName");
那么在你看来
@Html.DropDownList("State")