2012-09-25 11 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 단계의 콤보 박스가 있습니다. 다른 세 가지 레벨에 대한 컨트롤러 코드를 반복해야합니까 아니면 드롭 다운 목록을 채울 수있는 또 다른 방법이 있습니까? 그렇다면 복잡하지 않은 방법으로 알려주십시오.

답변

0

데이터베이스에서 4 번 칠 필요가 없습니다.

var list = new SelectList(LevelLst); 

ViewBag.Level1 = list; 
ViewBag.Level2 = list; 
ViewBag.Level3 = list; 
ViewBag.Level4 = list; 

을 그리고보기에 그것을 렌더링 : 당신은 당신의 컨트롤러, 샘플, 같은 selectList의 객체로 ViewBag에서 4 개 속성을 추가 할 수있는 모든의

<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 작업에

, 당신은이 뷰 모델 클래스의 인스턴스에 컬렉션 항목을 설정하고보기에 그 보내드립니다. GetItemsForCategory 방법을 가정

public ActionResult Index() 
{ 
    var prodVM=new ProductViewModel(); 
    prodVM.Level1Items=GetItemsForCategory(1); 
    prodVM.Leve21Items=GetItemsForCategory(2); 
    prodVM.Leve31Items=GetItemsForCategory(3); 
    return View(prodVM); 
} 

@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의 행동에, 카테고리 ID를 받아 데이터 소스 당신의 강력한 형식의보기에 지금

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

에서 SelectListItems의 목록을 반환 , 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); 
}