2017-10-27 7 views
0

확인 모든 이상한 하나 여기에 .... 난 4 일 전에와 오늘 날짜를 포함하는 드롭 다운 목록과 전망을Viewbag 연준 DropdownFor - 액션 선택한 후에 삭제합니다 속성은 파람을 가지고

...

Index (Action)가 DateTime에 대해 null로 설정되어 있으면 현재 날짜가 이미 선택된 DropDownList가 나타납니다 ... 좋습니다!

HTML 소스 URL \ 컨트롤러 \ 지수

<select class="form-control" id="Date" name="Date" onchange="Change_Date(this)" 
    <option value="23/10/2017">23/10/2017</option> 
    <option value="24/10/2017">24/10/2017</option> 
    <option value="25/10/2017">25/10/2017</option> 
    <option value="26/10/2017">26/10/2017</option> 
    <option selected="selected" value="27/10/2017">27/10/2017</option> 
    </select> 

지수 (액션)이이 똑같은 과정을 거친 내가 물리적으로 선정 = 진정한 속성을 볼 수 있지만, 날짜 시간으로 실행되면 ViewBag.DateList에서 ... 드롭 다운에는 선택된 옵션이없고 처음으로 되돌아갑니다.

HTML 소스 URL \ 컨트롤러 \ 지수? 날짜 = 2017년 10월 26일

<select class="form-control" id="Date" name="Date" onchange="Change_Date(this)" 
    <option value="23/10/2017">23/10/2017</option> 
    <option value="24/10/2017">24/10/2017</option> 
    <option value="25/10/2017">25/10/2017</option> 
    <option value="26/10/2017">26/10/2017</option> 
    <option value="27/10/2017">27/10/2017</option> 
    </select> 

내가 JS를 우회 URL에 직접 날짜를 넣어 시도했지만 운이 아니도록했다. ..

가지는? 날짜 = URL에 날짜이 옵션 요소에서 선택한 속성을 제거하는 이유를 이해할 수없는

...

그냥 둘 난에 걸린 될 ViewBag.DateList 내에 Selected = True 속성이 있지만, 매개 변수가 작업에 전달 될 때 예상대로 렌더링되지 않습니다. URL에

보기

@Html.DropDownList("Date", (IEnumerable<SelectListItem>)ViewBag.DateList, 
    new { @class = "form-control", @onchange="Change_Date(this)" }) 

방법

public ActionResult Index(DateTime? date) 
    { 
     if (date.HasValue == false) 
     { 
      date = DateTime.Now.Date; 
     } 
     List<SelectListItem> Dates = new List<SelectListItem>(); 
     for (int i = -4; i < 1; i++) 
     { 
      string date_display = DateTime.Now.Date.AddDays(i).ToShortDateString(); 
      Dates.Add(new SelectListItem { Text = date_display, Value =date_display}); 
     } 

     foreach (SelectListItem item in Dates) 
     { 
      if (item.Value == date.ToShortDateString()) 
       item.Selected = true; 
     } 
     ViewBag.DateList = Dates; 
    } 

JS

function Change_Date(val) 
{ 
    var value = $('#Date').val(); 
    value = value.split("/").reverse().join("-"); 
    var url = "/Controller/Index?date=" + value; 
    window.location.href = url; 
} 

답변

1

?date=date는 추가 메서드에 date이라는 매개 변수가 있으므로 date에서 ModelState 값 양식 컨트롤을 생성하는 HtmlHelper 메서드는 바인딩이 존재하면 ModelState의 값을 사용하고 (ViewData에서 마지막으로 실제 모델 속성에서). 동작에 대한 설명은 this answer의 두 번째 부분을 참조하십시오.

내부적 DropDownList() (및 DropDownListFor()) 메소드는 새로운 IEnumerable<SelectListItem>를 구축하고 해당하지 null 경우 속성에 기초 Selected 속성 값 네 (케이스 Date에)에 바인딩을 설정한다.

../Controller/Index?date=2017-10-26을 사용하여 리디렉션하면 date 매개 변수 (및 ModelState 값)의 값은 26/10/2017 12:00:00 AM이됩니다.DropDownList() 방법은 ViewBag.DateList 통해 반복하여 IEnumerable<SelectListItem>을 구축 할 때, 그것은 ModelStatedate의 가치와 SelectListItem 값의 .ToString() 특성을 비교하여 일치하는 항목을 찾습니다하지 않습니다 그래서 옵션은 다음과 같이 설정되어 있지 않은 (문자열 "26/10/2017 12:00:00 AM""26/10/2017" 같지 않음) 선택된.

일부 옵션 선택 올바른 옵션이 뷰를 반환 전에 제어 방법에 ModelState.Clear() 추가

  1. 포함합니다.
  2. 의 상단에있는 매우 명확한 설명을 위해 예를 들어, @Html.DropDownList("SelectedDate", ...)
+0

아주 좋은 ... 감사 방법의 매개 변수의 이름, 또는 일치하지 않도록 드롭 다운리스트에서 이름 중 하나를 변경 대답. ModelState가 URL에서 가져온 것을 몰랐습니다. –