3

다른보기 모델의 목록 인 속성을 포함하는보기에 부모 뷰 모델이 바인딩되어 있습니다.ASP.Net MVC 3 DropDownListFor에 대해 선택된 값이 설정되지 않음

public List<SelectListItem> Days { get; set; } 
    public int Index { get; set; } 
    public List<SelectListItem> Hours { get; set; } 
    [Display(Name = "Select Day")] 
    public int SelectedDay { get; set; } 
    [Display(Name="Start Time")] 
    public int SelectedStartTime { get; set; } 
    [Display(Name = "End Time")] 
    public int SelectedEndTime { get; set; } 

    public AvailableTimeSlotViewModel(int index) 
    { 
     Index = index; 
     _entities = Repository.GetRepository(); 
     Days = new List<SelectListItem>(); 
     _entities.Days.ToList().ForEach(d => Days.Add(new SelectListItem { Value = d.DayId.ToString(), Text = d.Name })); 
     Hours = new List<SelectListItem>(); 
     _entities.Hours.ToList().ForEach(h => Hours.Add(new SelectListItem { Value = h.HourId.ToString(), Text = h.Name })); 
    } 

그리고 UserPreferences에 바인드 뷰의 코드 :

var timeAvailability = (from u in _entities.UserTimeAvailabilities 
            where u.UserId == userId 
            select u).ToList(); 
      for(int index = 0; index < timeAvailability.Count; index++) 
      { 
       var availableTime = timeAvailability[index]; 
       TimeAvailability.Add(new AvailableTimeSlotViewModel(index) 
             { 
              SelectedDay = availableTime.DayId, 
              SelectedStartTime = availableTime.StartHourId.HasValue ? availableTime.StartHourId.Value : 0, 
              SelectedEndTime = availableTime.EndHourId.HasValue ? availableTime.EndHourId.Value : 0 
             }); 
      } 

TimeAvailability이 목록 여기

이 AvailableTimeSlotViewModel입니다 : 여기

는 상위 뷰 모델 코드 :

<div id="time-availability-div">     
      @for (int index = 0; index < Model.TimeAvailability.Count; index++) 
      {      
       <table> 
        <thead> 
         <tr> 
          <td> 
           @Html.LabelFor(m => m.TimeAvailability[index].SelectedDay) 
          </td> 
          <td> 
           @Html.LabelFor(m => m.TimeAvailability[index].SelectedStartTime) 
          </td> 
          <td> 
           @Html.LabelFor(m => m.TimeAvailability[index].SelectedEndTime) 
          </td> 
         </tr> 
        </thead> 
        <tbody> 
         <tr> 
          <td> 
           @Html.DropDownListFor(m => m.TimeAvailability[index].SelectedDay, Model.Days) 
          </td> 
          <td> 
           @Html.DropDownListFor(m => m.TimeAvailability[index].SelectedStartTime, Model.Hours) 
          </td> 
          <td> 
           @Html.DropDownListFor(m => m.TimeAvailability[index].SelectedEndTime, Model.Hours) 
          </td> 
         </tr> 
        </tbody> 
       </table>     
      } 
     </div> 

한 가지주의 할 점은 DropDownListFor에서 선택한 값을 명시 적으로 설정하면 올바르게 작동한다는 것입니다. 선택한 값이 인덱스의 속성을 자동으로 참조하는 이유가 궁금합니다.

답변

1

왜 내가 선택한 값이 인덱스의 속성을 자동으로 참조하는 것이 아닌지 궁금합니다.

복잡한 컬렉션 람다 식을 첫 번째 인수로 사용했기 때문에 : m => m.TimeAvailability[index].SelectedEndTime. 불행하게도 DropDownListFor 도우미는 복잡한 표현식의 기본값을 자동으로 설정하는 것을 지원하지 않으므로 선택한 값을 설정해야합니다.

@Html.DropDownListFor(
    m => m.TimeAvailability[index].SelectedEndTime, 
    new SelectList(Model.Hours, "Value", "Text", Model.TimeAvailability[index].SelectedEndTime) 
)