2011-08-03 4 views
1

これはシンプルにする必要があるようですが、動作させる方法を理解できません。RazorとHtml.DropDownList:リストの各行のドロップダウンに選択した値を設定しますか?

私のデータモデルには、 "Server"テーブルと "ServerType"テーブルがあります。両方のテーブルのPKはintであり、ServerはServerTypeIdのフィールドであるServerTypeIdを持ちます。

@model IEnumerable<Server> 
<table border="1"> 
    <tr> 
     <th> 
      Server Type 
     </th> 
     <th> 
      Name 
     </th> 
    </tr> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
       @Html.DropDownListFor(modelItem => item.ServerTypeId, (IEnumerable<SelectListItem>)ViewData["ServerType"]) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.Name) 
      </td> 
     </tr> 
    } 
</table> 

私のコントローラがあります:

私はIEnumerableをに入力されレイザーList.cshtmlを持って

public ActionResult List() 
    { 
     var s = GetServers(); 
     ViewData["ServerType"] = GetServerTypes(); 
     return View("List", s); 
    } 

    private List<SelectListItem> GetServerTypes() 
    { 
     string id; 
     SelectListItem si; 
     List<SelectListItem> sl = new List<SelectListItem>(); 
     IQueryable<ServerType> items = (from t in _entities.ServerTypes select t); 
     foreach (var item in items) 
     { 
      id = item.Id.ToString(); 
      si = new SelectListItem { Value = id, Text = item.Description }; 
      sl.Add(si); 
     } 
     return sl; 
    } 

これは、データを表示しますが、ドロップダウンに値が選択されていません。私はHtml.DropDownListとHtml.DropDownListForの両方を、ViewDataプロパティの名前の異なる順列を使用して試しました。

Selectedプロパティを設定するためにServerTypeのコピーを持つビューモデルを作成する必要がありますか?または、私のIDがintで、SelectItemList Valueプロパティが文字列なので問題ですか?

答えて

1

GetServerTypes()のListの母集団では、いずれの項目も選択されていません。これは、MVC3がDropDownListForメソッドでそれを推論するほどスマートではないため、手動で行う必要があります。これは、あなたが単一のモデルを使用していないという事実によってさらに複雑になります。

行うには良い方法これは次のようになります。

がコントローラについて

(下記のコードで心に留めておいてください、私は、サーバークラスは、「ID」と呼ばれるプライマリIDを持っていることを前提としています)コード:

public ActionResult List() 
{ 
    IEnumerable<Server> s = GetServers(); 
    ViewData["ServerTypes"] = GetServerTypes(s); 
    return View("List", s); 
} 

private Dictionary<int, SelectList> GetServerTypes(IEnumerable<Server> s) 
{ 
    Dictionary<int, SelectList> sl = new Dictionary<int, SelectList>(); 
    IEnumerable<ServerType> items = (from t in _entities.ServerTypes select t); 
    foreach (Server srv in s) { 
     sl.Add(srv.Id, new SelectList(items, "Id", "Description", srv.ServerTypeId)); 
    } 
    return sl; 
} 

ビューコードの場合:

(また、私のしましたが、ラムダ関数で使用される引数を修正する方法の下に注意してください)
@model IEnumerable<Server> 
<table border="1"> 
    <tr> 
     <th> 
      Server Type 
     </th> 
     <th> 
      Name 
     </th> 
    </tr> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
       @Html.DropDownListFor(modelItem => modelItem.ServerTypeId, (IEnumerable<SelectListItem>)(ViewData["ServerTypes"][item.Id])) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => modelItem.Name) 
      </td> 
     </tr> 
    } 
</table> 
1

@TreyEは、特定の選択リスト項目をビューに表示するときに選択することを決して指定しないことを正しく指摘します。

これを行うにはいくつかの方法があります。まず、SelectListオブジェクトを使用して、コンストラクタを使用して、選択する必要のあるオブジェクトを渡すことができます。オーバーロードはSelectList(IEnumerable, String, String, Object)MSDN SelectListです。

SelectListは、FYIでは.NET 3.5以上でのみサポートされています。

第二に、GetServerTypes()であなたが書くことができます:

private List<SelectListItem> GetServerTypes() 
{ 
    List<SelectListItem> sl = new List<SelectListItem>(); 
    IQueryable<ServerType> items = (from t in _entities.ServerTypes select t); 

    foreach (var item in items) 
     sl.add(new SelectListItem { Value = item.id, Text = item.Description, Selected = item.isSelected }); 

    return sl; 

} 

また一つだけのアイテムが選択されるべきであることを覚えておいてください、あなたは、いくつかのブール型プロパティを使用しようとするならば、それは不可能であることを確認している複数のitemisSelectedプロパティがtrueに設定されている可能性があります。

ifステートメントのタイプを使用して、Selected = true(つまり、アイテムにisSelectedブール値がない場合)、それをforeachループに追加できます。

foreach(var item in items) 
{ 
    if //condition 
     sl.Add(new SelectListItem { Value = item.id, Text = item.Description, Selected = true }); 

    else 
     sl.Add(new SelectListItem { Value = item.id, Text = item.Description, Selected = false }); 
} 
1

まだ彼は答えを探しています。これを動作させるには3つのことが必要でした。

  1. @foreachの代わりにUser @forを使用してください。これは、物事に名前を付けるときに を動作させるためのインデックスを持っています。
  2. ViewBag変数名には、プロパティと同じ を使用しないでください。同じ名前を持っていれば、あなたを助けようとしてくれることもあります。 も早く結び付けます。
  3. SelectListのコンストラクタの現在の値を渡します。

    @for (int i = 0; i < Model.Count; i++) 
        { 
         <tr> 
          <td>   
         @Html.DropDownListFor(modelItem => Model[i].operatorToken, 
    new SelectList(ViewBag.operatorTokensList, "Value", "Text", Model[i].operatorToken), 
    "Select", htmlAttributes: new { @class = "form-control" }) 
    
    
    
    ...ect... 
        } 
    

    お知らせSelectListのに4番目のパラメータ()選択された値を設定します:私 コードはようになりました。

    マイoperatorTokensListを用いて評価された :(ユーザー等、 "以上"、 "より大きい" を選択した)

    new[] { new { Value = ">", Text = ">" }, 
           new { Value = ">=", Text = ">=" }, 
           new { Value = "=", Text = "=" }, 
           new { Value = "<=", Text = "<=" }, 
           new { Value = "<", Text = "<" } }; 
    

関連する問題