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

これがView Partにあるものです。

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

問題なく正常に動作しますが、4 レベルのコンボボックスを埋める必要があります。他の 3 つのレベルに対してコントローラー コードを繰り返す必要がありますか?それとも、ドロップダウン リストを埋める別の方法がありますか? はいの場合は、簡単な方法でお知らせください。

4

2 に答える 2

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 に答える
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 に答える