2012-09-25 235 views
0

我在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); 

,这就是我在查看部分;

<% using (Html.BeginForm("Index","Product",FormMethod.Get)) 
    { %> 
     **Level1**: <%:Html.DropDownList("Level1", "All")%>  
     <input type="submit" value="Filter" /></p> 
<%}%> 

它工作正常,没有任何问题,但我有4个级别的组合框来填补。我是否必须重复3个其他级别的控制器代码,或者有另一种方法来填充下拉列表?如果是,请以简单的方式告诉我。

回答

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> 
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,并从数据源

public List<SelectListItem> GetItemsForCategory(categoryId) 
{ 
    // to do :return the List of SelectListItem for each categoryID 
} 

现在在你的强类型查看返回SelectListItems的列表,

@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); 
}