我首先使用实体框架代码创建了一个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'。”非常感谢帮助!
答案 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")