2012-04-02 2 views
0

조직 목록 (CalledOrganizationSelectList)이 있는데 그 중 하나가 CalledOrganizationId입니다. 내 ViewModel에서 둘 다 설정하지만 MVC/면도기가 드롭 다운을 올바르게 렌더링하지 않습니다 (즉, 드롭 다운에서 올바른 항목에 대해 selected = "selected"속성을 설정하지 않음).ASP .Net MVC 3 Html.DropDown이 변수에 바인딩되지 않았습니다.

덜 비합리적인 해결 방법이 있습니다. 내 ViewModel에 새 멤버를 추가하고 그 드롭 다운을 바인딩했습니다. 이것은 잘 작동합니다. 내보기에서

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 = @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) 

:

<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> 
내 컨트롤러에서

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

... 지금이 작동을 중지 때까지

저는 처음으로 잡아 당긴 후에 작업했습니다. 내 머리카락에 남아있는 것을 밖으로 내 ViewModel에 새로운 변수를 도입함으로써, 괜찮아 보인다.

답변

3

ViewModel에서 2 가지 속성을 사용하면 DropDownLists를 올바르게 수행 할 수 있습니다. 한 속성은 사용 가능한 모든 옵션을 보유하고 있으며 다른 하나는 현재 선택된 옵션을 원하는 분야

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, "") 

: dropdownlists에서 선택한 항목과

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

내가 있었다 문제를. 위의 답변이 도움이되지 않으면 [this] (http://stackoverflow.com/questions/9832905/dropdownlistfor-does-not-select-selected-value)를 살펴보십시오. – Dmitry

+0

매우 신속하고 도움이되는 답변에 감사드립니다. 아직 작동하지 않지만 적어도 나는 미치지 않는다는 것을 알고 있습니다. 지금은 페이지가로드 된 후 드롭 다운을 설정하기 위해 몇 가지 jquery를 추가했습니다.이 모양은 ... ajd

관련 문제