2012-04-02 8 views
0

組織のリスト(CalledOrganizationSelectList)があり、そのうちの1つが呼び出されています(CalledOrganizationId)。 ViewModelで両方を設定しましたが、MVC/Razorがドロップダウンを正しく表示しません(つまり、ドロップダウンの正しい項目に対してselected = "selected"属性を設定しません)。ASP .Net MVC 3 Html.DropDownが変数にバインドされていません

さらに意味のない回避策があります。私は新しいメンバをViewModelに追加し、そのドロップダウンをバインドしました。これは正常に動作します。ちょうど今、それは動作を停止していますいつまで...私のコントローラで

public class CallViewModel{ 
public int? CalledOrganizationId { get; set; }   
public SelectList CalledOrganizationSelectList { get; set; }} 

:私の見解では

var vm = new CallViewModel(); 
var calledOrganizationSelectList = new List<object>(); 
calledOrganizationSelectList.Add(new {Text="",Id=""}); 
calledOrganizationSelectList.AddRange(
db.MyOrganizations.OrderBy(x=>x.Name) 
    .Select(x => new { Text = x.Name, Id =  x.Id.ToString()}).ToList()); 
var sl = new SelectList(calledOrganizationSelectList, "Id", "Text", 
    vm.CalledOrganizationId); 
vm.CalledOrganizationSelectList = sl; 
return View(vm); 

<div>CalledOrganizationId = 38 : select list contains  
<ul> 
<li>Value: Text: Is Selected: False</li> 
<li>Value: 37 Text: rrr Is Selected: False</li> 
<li>Value: 38 Text: sss1 Is Selected: True</li> 
</ul> 
</div> 
<select data-val="true" data-val-number="The field CalledOrganizationId must be a number." id="CalledOrganizationId" name="CalledOrganizationId"> 
<option selected="selected" value=""></option> 
<option value="37">rrr</option> 
<option value="38">sss1</option> </select> 
:私のレンダリングされたページのソースで

<div>CalledOrganizationId = @Model.CalledOrganizationId : 
select list contains 
<ul>@foreach (var itm in Model.CalledOrganizationSelectList) 
    {<li>Value: @itm.Value Text: @itm.Text Is Selected: @itm.Selected</li>} 
</ul> 
</div> 
@Html.DropDownList("CalledOrganizationId", Model.CalledOrganizationSelectList) 

私は最初に引っ張ってから取り組んだ私の髪の毛が残っていたものを外してから、私のViewModelに新しい変数を導入しました。これはうまくいくようです。

答えて

3

ViewModelに2つのプロパティを設定すると、DropDownListsを行う正しい方法です。 1つの特性は、使用可能なオプションのすべてを保持しており、他には、現在選択されているオプションを保持:

public class CallViewModel 
{ 
    // this captures the selected item 
    public int? CalledOrganizationId { get; set; } 

    // this contains the select list options  
    public IEnumerable<SelectListItem> CalledOrganizationSelectList { get; set; } 
} 

しかし、あなたはコントローラ内の空のオプションを追加する必要はありませんが。あなたは、ビューでこれを行うことができます。

@Html.DropDownListFor(m => m.CalledOrganizationId, 
    Model.CalledOrganizationSelectList, "") 

あなただけのコントローラでこれで逃げることができます。

var vm = new CallViewModel(); 
//var calledOrganizationSelectList = new List<object>(); 
//calledOrganizationSelectList.Add(new {Text="",Id=""}); 
//calledOrganizationSelectList.AddRange(
//db.MyOrganizations.OrderBy(x=>x.Name) 
// .Select(x => new { Text = x.Name, Id =  x.Id.ToString()}).ToList()); 
//var sl = new SelectList(calledOrganizationSelectList, "Id", "Text", 
// vm.CalledOrganizationId); 
//vm.CalledOrganizationSelectList = sl; 
vm.CalledOrganizationSelectList = db.MyOrganizations.OrderBy(x => x.Name) 
    .Select(x => new SelectListItem 
    { 
     Text = x.Name, 
     //Id = x.Id.ToString() // do not use "Id" for the property name, 
     Value = x.Id.ToString() // use "Value" -- it is a SelectListItem property 
    }); 

// if you want to set the selected item on the dropdownlist, do it here 
vm.CalledOrganizationId = 37; 

return View(vm); 
+0

私はdropdownlistsで選択した項目とのトラブルがありました。上記の答えが役に立たない場合は、[this](http://stackoverflow.com/questions/9832905/dropdownlistfor-does-not-select-selected-value)を調べることを検討してください。 – Dmitry

+0

非常に迅速で有益な回答をいただきありがとうございます。まだ動作していませんが、少なくとも私は狂っていないと知っています。今のところ、ページがロードされた後にドロップダウンを設定するjqueryをいくつか追加しました。これは次のようになります... ajd

関連する問題