填写下拉列表

时间:2012-09-25 14:45:21

标签: asp.net-mvc

我是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个级别重复控制器代码,或者还有另一种方法来填充下拉列表?如果是,请以简单的方式告诉我。

2 个答案:

答案 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);
}