我是MVC和ENtityframework的新手。
我想填写一个下拉列表,我已将控制器编码为:
var LevelLst = new List<string>();
var LevelQry = from d in db.Products
where d.CategoryLevel==1
orderby d.CategoryName
select d.CategoryName;
LevelLst.AddRange(LevelQry.Distinct());
ViewBag.Level1 = new SelectList(LevelLst);
这就是我在View Part中的内容;
<% using (Html.BeginForm("Index","Product",FormMethod.Get))
{ %>
**Level1**: <%:Html.DropDownList("Level1", "All")%>
<input type="submit" value="Filter" /></p>
<%}%>
它工作正常没有任何问题,但我有4级组合框来填补。我是否必须为其他3个级别重复控制器代码,或者还有另一种方法来填充下拉列表?如果是,请以简单的方式告诉我。
答案 0 :(得分:0)
您不需要在数据库中点击4次。您可以在ViewBag中添加4个属性,在控制器上使用相同的SelectList对象:
var list = new SelectList(LevelLst);
ViewBag.Level1 = list;
ViewBag.Level2 = list;
ViewBag.Level3 = list;
ViewBag.Level4 = list;
并在您的视图中呈现:
<p>
<label>Level 1: </label> <%: Html.DropDownList("Level1", "All") %>
</p>
<p>
<label>Level 2: </label> <%: Html.DropDownList("Level2", "All") %>
</p>
<p>
<label>Level 3: </label> <%: Html.DropDownList("Level3", "All") %>
</p>
<p>
<label>Level 4: </label> <%: Html.DropDownList("Level4", "All") %>
</p>
答案 1 :(得分:0)
首先,尽量避免像ViewBag / ViewData 这样的动态内容将数据从控制器传输到视图。始终使用强类型视图。
因此,您将为视图创建视图模型。
public class ProductViewModel
{
public int ProductID { set;get;}
public List<SelectListItem> Level1Items { set;get;}
public int Level1SelectedItem { set;get;}
public List<SelectListItem> Level2Items { set;get;}
public int Level2SelectedItem { set;get;}
public List<SelectListItem> Level3Items { set;get;}
public int Level3SelectedItem { set;get;}
public ProductViewModel()
{
Level1Items =new List<SelectListItem>();
Level2Items =new List<SelectListItem>();
Level3Items =new List<SelectListItem>();
}
}
在您的GET操作中,您将集合项设置为此viewmodel类的实例并将其发送到您的视图。
public ActionResult Index()
{
var prodVM=new ProductViewModel();
prodVM.Level1Items=GetItemsForCategory(1);
prodVM.Leve21Items=GetItemsForCategory(2);
prodVM.Leve31Items=GetItemsForCategory(3);
return View(prodVM);
}
假设GetItemsForCategory方法接受类别id并从数据源返回SelectListItems列表
public List<SelectListItem> GetItemsForCategory(categoryId)
{
// to do :return the List of SelectListItem for each categoryID
}
现在在强类型视图中,
@model ProductViewModel
@using(Html.BeginForm())
{
Level 1 :
@Html.DropDownListFor(m => m.Level1SelectedItem ,
new SelectList(Model.Level1Items,"Value", "Text")"Select")
Level 2 :
@Html.DropDownListFor(m => m.Level2SelectedItem ,
new SelectList(Model.Level2Items,"Value", "Text")"Select")
Level3 :
@Html.DropDownListFor(m => m.Level3SelectedItem ,
new SelectList(Model.Level3Items,"Value", "Text")"Select")
<input type="submit" />
}
在您的HTTPPOST操作中,您将获得Level1SelectedItem属性中第一个下拉列表的选定值(同样适用于其他下拉列表)
[HttpPost]
public ActionResult Index(ProductViewModel model)
{
if(ModelState.IsValid)
{
//check for model.Level1SelectedItem property value
}
//to do : reload the dropdown items
return View(model);
}