2017-01-25 11 views
2

私のdropDownリストはデフォルト値を望んでいません!DropDownListを設定したくない

<div class="form-group"> 
      @Html.LabelFor(model => model.unit, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(x => x.unit.id, selectUnit) 
       @Html.ValidationMessageFor(model => model.unit.id, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

私は正しいリストを表示しますが、どれも選択されていません。

私はViewBagを使用して、私のSelectListのを取得:私はCSHTMLをブレークポイントすると

@{ 
    IEnumerable<SelectListItem> selectUnit = ViewBag.Unit; 
} 

、Model.unit.idは4であり、値として4で一つのアイテムを持っているselectUnit。

私は

@selectUnit.Where(x => x.Value == Model.unit.id.ToString()).First().Text 

を行うと、それは右のテキスト値を選択!

ラッツは思う:これは私のユニットのモデルである:事前の人々で

public class Unit 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string description { get; set; } 
    public IList<Unit> children { get; set; } 
} 

おかげで、私はなってきてるcrasy

EDIT:

public class ModelPassedTroughTheView 
{ 
    ... 
    public Unit unit { get; set; } 
} 

EDIT 2:フルコード:

Editページ: @model BE.DealerGroupSAP

@{ 
    ViewBag.Title = Resources.Admin.DealerGroup_Edit; 

    IEnumerable<SelectListItem> selectUnit = ViewBag.Unit; 
} 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>@ViewBag.Title</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.id) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.unit, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(x => x.unit.id, selectUnit) 
       @Html.ValidationMessageFor(model => model.unit.id, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="@Resources.Global.Save_Edits" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

モデル通行人トラフビュー:

public class DealerGroupSAP 
{ 
    public int id { get; set; } 
    public Unit unit { get; set; } 
} 

単位のオブジェクト:

public class Unit 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string description { get; set; } 
    public IList<Unit> children { get; set; } 
} 

コントローラの内容:

ViewBag.Unit = GetUnits(); 
return View(BL.AnomalyBL.GetAllSAPResponsible(id)); 
+0

'Unit' - ' Unit'を含むクラス( '{get; set;}'を持つプロパティではない最良の推測) –

+0

@StephenMuecke:ありがとう!私は投稿を更新しました。渡されたモデルにはacessorsを持つ1つのUnitフィールドが含まれているので、問題は解決しませんでした。 – clement

+0

表示されたコードは正常に動作するはずです(そして、_しかし何も選択されていません)。 –

答えて

2

問題は、モデルにunitという名前のプロパティがあり、SelectListビューViewBagという名前のプロパティがUnit(MVCのモデルバインディング機能では大文字と小文字を区別しません)という名前のプロパティがあることです。

変更

ViewBag.UnitList = GetUnits(); 

とビューの

@{ IEnumerable<SelectListItem> selectUnit = ViewBag.UnitList } 

(例えば)へViewBagプロパティの名前と正しいオプションが選択されます。

DropDownListFor()方法は、その後ViewDataをチェックし、(あなたの場合には存在しません)ModelStateの最初の検査値でdefaultValue(選択項目)を決定します。内部で何が起こっているのかを説明するの


ViewDataIEnumerable<SelectListItem>、宿泊施設にidが含まれていませんUnitためのキー/値のペア、defaultValuenullで、メソッドがIEnumerable<SelectListItem>あなたが<option>要素を構築するためのビューに渡された使用が含まれているため、いずれもSelected = true値を持っています、何かが必要なので最初のオプションが選択されます。

ViewBagプロパティを変更するに(例えば)UnitListViewDataunitのための一致するキーが見つからない方法を意味し、現在は存在してunit.idのためのモデルを、検査、およびdefaultValue = 4を設定します。 defaultValuenullではないため、新しいIEnumerable<SelectListItem>が内部で生成され、対応するSelectListItemSelectedプロパティがtrueに設定されています。

詳細については、SelectExtensions - 特にprivate static MvcHtmlString SelectInternal()メソッドのソースコードを調べることができます。

最後に、は常にビューモデルを使用する理由の1つです。

+0

補足として、この[DotNetFiddle](https://dotnetfiddle.net/OxriS9)は興味深いかもしれません –

関連する問題