0

我是 MVC 和实体框架的新手。

我想填写一个下拉列表,我对控制器进行了如下编码:

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

4

2 回答 2

0

您不需要在数据库中点击 4 次。例如,您可以在控制器上使用相同的 SelectList 对象在 ViewBag 中添加 4 个属性:

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>
于 2012-09-25T14:51:11.360 回答
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 操作中,您将集合项设置为此视图模型类的实例并将其发送到您的视图。

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);
}
于 2012-09-25T15:06:12.247 回答