2012-09-25 276 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); 
}