2017-01-27 17 views
0

をグループ化し維持されませんレコードを作成/編集するときにユーザーが最初に選択した値を保持する必要があるからです。編集ビューDDLは、私がこれを持って私の編集アクションで

ClassName.lstItems()

public static List<SelectListItem> lstItems() 
    { 
     List<SelectListItem> lstAllItems = new List<SelectListItem>(); 

     using (var context = new ConnectionString()) 
     { 
      List<Table1> lstTable1Items = 
       context.Table1.Where(x => x.deleted == false).ToList(); 

      var groups = 
       lstTable1Items .OrderBy(x => x.Table2.Property1).GroupBy(x => x.Table2.Property1); 

      foreach (var group in groups) 
      { 
       var slg = new SelectListGroup() {Name = group.Key}; 
       foreach (Table1 table1Item in group) 
       { 
        SelectListItem item = new SelectListItem() {Text = table1Item .PropertyText, Value = table1Item .ID.ToString(), Group = slg}; 
        lstAllItems.Add(item); 
       } 
      } 
     } 

     return lstAllItems; 
    } 

はもちろん、私はグループ化されたドロップダウンリストが欲しいです。しかし、私の編集アクションでは、グループ化されていません。ページの読み込み時に元の値を選択値として使用しているときに、どのようにしてドロップダウンリストをグループ化したままにしますか?

レイザー

<div class="form-group"> 
     @Html.LabelFor(model => model.itemID, htmlAttributes: new { @class = "control-label col-md-4" }) 
     <div class="col-md-8"> 
      @Html.DropDownList("DropDownList2", null, "Select Item", htmlAttributes: new { @class = "form-control" }) 
      @Html.ValidationMessageFor(model => model.itemID, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

UPDATE

public class TestClass 
{ 
    private ConnectionString context; 

    public TestClass() 
    { 
     context = new ConnectionString(); 
    } 

    public IEnumerable<SelectListItem> GetListItems() 
    { 

     TestClass className = new TestClass(); 

     // assumes `context` is a field on your class, 
     // set in the contructor, after being injected 
     return className.context.Table1 
      .Where(x => x.deleted == false) 
      .GroupBy(x => x.Table2.Property1) 
      .Select(x => { 
       var group = new SelectListGroup { Name = x.Key }; 
       return x.Select(i => new SelectListItem 
       { 
        Text = i.PropertyText, 
        Value = i.ID.ToString(), 
        Group = group 
       }); 
      }) 
      .SelectMany(x => x);  
    } 
} 
+0

に型付けされていますか? –

+0

@KD ['SelectListItem'](https://msdn.microsoft.com/en-us/library/system.web.mvc.selectlistitem(v = vs.118).aspx)には、「グループ」というプロパティがあります。グループ内で各選択リスト項目をグループ化することができます。ドロップダウンリストでは、グループ名で各選択を分類することができます –

+0

編集アクションで選択リストを入力しながらグループを指定することは可能でしょうか? –

答えて

1

あなたは、したがって、グループ化を失う、SelectListItemsのリストから新しいSelectListを作成しています。最良の解決策はSelectListItemのリストを使用し、DropDownListForヘルパーメソッドを使用することです。あなたのビューで今すぐ

var yourViewModel = new YourViewModel(); 
ViewBag.DropDownList2 = lstItems(); 
yourViewModel.SelectedItemId= "b"; // replace with the value you want set selected as 
return View(yourViewModel); 

強く正確にあなたが「グループ化」によって何を意味するかYourViewModel

@Html.DropDownListFor(s=>s.SelectedItemId, ViewBag.DropDownList2 as List<SelectListItem>) 
0

問題は、独自のSelectListを作成しています。 DropDownListForにはIEnumerable<SelectListItem>のみが必要です。 RazorはModelStateのデータに基づいて適切な項目を選択してSelectListを作成します。

一般に、ViewBag.DropDownList2を両方の場合のClassName.lstItems()の戻り値に設定するだけで、Razorに処理させる必要があります。

つまり、ここにあるコードにはいくつかの問題があります。まず第一に、最も重要なのは、複数のバージョンのコンテキストを作成するのを避けるべきです。ほとんどの場合、Entity Frameworkのコンテキストと合わせてusingを使用すると、間違ったことをしていることを意味します。代わりに、手動で、または依存性注入コンテナを使用して、操作する必要のあるクラスにコンテキストを注入します。コンテキストにはリクエストライフタイムが必要です。つまり、1回のリクエスト内ですべてのコンテキストに同じコンテキストを使用する必要があります。

第二に、あなたのlstItemsコードを大幅に簡略化することができます。

public class TestClass 
{ 
    private ConnectionString context; 

    public TestClass() 
    { 
     context = new ConnectionString(); 
    } 

    public IEnumerable<SelectListItem> GetListItems() 
    { 

     TestClass className = new TestClass(); 

     // assumes `context` is a field on your class, 
     // set in the contructor, after being injected 
     return className.context.Table1 
      .Where(x => x.deleted == false) 
      .GroupBy(x => x.Table2.Property1) 
      .Select(x => { 
       var group = new SelectListGroup { Name = x.Key }; 
       return x.Select(i => new SelectListItem 
       { 
        Text = i.PropertyText, 
        Value = i.ID.ToString(), 
        Group = group 
       }); 
      }) 
      .SelectMany(x => x);  
    } 
} 
+0

だから、 'var context = new ConnectionString();'をクラスの先頭に置き、静的メソッドの中には入れないでください。 –

+0

いいえ、それをコンストラクタに渡します。 –

+0

あなたのサンプルコードでこれを表示できますか? –

関連する問題