@{
HotelManagementEntities db = new HotelManagementEntities();
var list = db.tblCategories.Select(m => new { m.intseqid, m.varCategory}).ToList();
ViewBag.Category = new SelectList(db.tblCategories, "intseqid", "varCategory");
}
@Html.DropDownList("tblCategories",
ViewBag.Category as SelectList,
new
{
@class = "drplist",
id = "drpItemCat",
ng_show = "selectfieldforcat"
})
答案 0 :(得分:0)
您的代码中存在问题,您在此处填充数据库中的列表:
var list = db.tblCategories.Select(m => new { m.intseqid, m.varCategory}).ToList();
但在创建SelectList
时在代码中,您将再次使用dbContext从数据库中获取记录:
ViewBag.Category = new SelectList(db.tblCategories, "intseqid", "varCategory");
// note the db.tblCategories as first parameter, this is wrong
如果您实际上已经在视图中编写了此代码,那么您甚至不需要ViewBag
,但是您的方法不对,您应该在控制器操作中编写poupulation代码然后使用它在视图中:
public ActionResult SomeAction()
{
HotelManagementEntities db = new HotelManagementEntities();
ViewBag.Category = new SelectList(db.tblCategories, "intseqid", "varCategory");
}
答案 1 :(得分:0)
尽管如此,基于您的代码在视图中进行数据检索并不是一个好习惯,您可以尝试以下方法:
@{
var db = new HotelManagementEntities();
var list = db.tblCategories.Select(m => new
{
m.intseqid,
m.varCategory
}).ToList();
}
@Html.DropDownList("tblCategories", new SelectList(@list, "intseqid", "varCategory"));
创建模型的更合适的方法是将SelectList
对象作为属性包含在内。然后在控制器的相应操作中创建一个新模型并将类别设置为上面提到的属性。您的视图的最后一遍(所以现在您必须定义您的视图需要一个特定类型的模型,您在上面声明)模型,并在dropdownlist html helper中执行以下操作:
@Html.DropDownList("tblCategories", Model.Categories)
通过这种方式,您更加坚持在MVC模式中构建的关注点分离,并且从长远来看,您的代码将更易读和可维护。你的例子非常简单。所以我之前提到的不能在这一点上看到。然而,虽然你的模型会更复杂,你必须在视图中做更多的事情,你会发现我的意思是说更具可读性和可维护性。
最后但并非最不重要的是,尽量避免使用ViewBag。显然,你可以通过使用ViewBag来完成你所要做的事情,但是你将一个强类型对象作为一个模型传递给你的视图要好得多,你需要在视图上显示而不是添加东西在控制器的ViewBag中,然后在视图中使用强制转换来执行任何操作。
答案 2 :(得分:0)
在控制器中:
public ActionResult Add()
{
ViewBag.countryList = GetCountries();
return View();
}
在剃须刀中查看.csHtml
@Html.DropDownListFor(x => x.countryId, new SelectList(ViewBag.countryList, "id", "Name"), 'Select Country',
new { @id = "ddlCountry", @rows = 1 })