2012-11-30 1 views
0

ASP.NET MVC3 응용 프로그램이 있습니다. 나는 ViewModel 다음과 같습니다ASP.NET MVC3에서 서버 호출간에 DropDownList 값을 유지하는 방법

public class MyViewModel 
{ 
    public string Year { get; set; } 
    public string Month {get; set; } 

    public IEnumerable<SelectListItem> Years 
    { 
     get 
     { 
      return Enumerable.Range(2000, DateTime.Now.Year - 2000).Select(x => new SelectListItem 
      { 
       Value = x.ToString(), 
       Text = x.ToString() 
      }); 
     } 
    } 
} 

그리고 다음 View :

@model MyNamespace.MyViewModel 

@Html.DropDownListFor(
     x => x.Year, 
    new SelectList(Model.Years, "Value", "Text"), 
    "-- select year --" 
) 

@Html.DropDownListFor(
     x => x.Month, 
    Enumerable.Empty<SelectListItem>(), 
    "-- select month --" 
) 

을 내가 완벽하게 작동 Year에 대한 DropDownList에서 onchange을 트리거되는 jQuery 기능과 Month에 대한 DropDownList을 입력합니다. 양식이 서버에 게시되고 뷰가 다시 렌더링 될 때 'Month'DropDownList에 값을 유지하려면 Year에 대해 올바르게 발생합니다. 그러므로 나는 (JQuery와 스크립트 이외의) 시도 :

public class MyViewModel 
{ 
    public string Year { get; set; } 
    public string Month {get; set; } 

    public IEnumerable<SelectListItem> Months 
    { 
     get 
     { 
      if(Year != null) 
      { 
       return Enumerable.Range(1, 12).Select(x => new SelectListItem 
       { 
        Value = x.ToString(), 
        Text = x.ToString() 
       }); 
      } 
     } 
    } 

그리고 View에 : 나는 일을 짧게하기 위해 코드에서 년을 왼쪽

@Html.DropDownListFor(
      x => x.Month, 
     new SelectList(Model.Months, "Value", "Text"), 
     "-- select month --" 
    ) 

합니다. 이 코드는 IEnumerable이 비어 있기 때문에 처음 실행될 때 NullReferenceException을 발생시킵니다. 어떻게하면 목표를 달성 할 수 있을까요?

+0

작은 질문이지만 왜 올해의 변화 이벤트를 토대로 한 달을 채우는 것을 귀찮게합니까? 같은 시간에 둘 모두를 채우려는 것 같아서 궁금합니다. – IyaTaisho

+0

@IyaTaisho, 통계를 표시하는 응용 프로그램을 만들고 동일한 논리로 일을 채 웁니다. 또한 사용자에게 – CiccioMiami

답변

3

작업의 월 목록을 다시 채워 넣어야합니다. POST는 상태가 저장되지 않으므로 asp.net webforms와 다릅니다. 그냥 코드에서 같은 것을 할 :

public ViewResult MyAction(MyViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //.. do your stuff ... 
     //return redirect to index if everything went ok 
    } 

    //something went wrong return the model 
    model.Years = new SelectList(/* code to populate years */, "Value", "Text", Model.Year); 
    model.Months = new SelectList(/* code to populate months */, "Value", "Text", Model.Month); 
} 

내가 컨트롤러의 기본 값을 설정할 수 있습니다 beacuse 내 의견 컨트롤러 책임에 대한 (대신 IEnumerable<SelectListItem>의 더 잘 맞는을 SelectList를 사용하는 것을 선호 보조 노트로)가 아니라보기.

+0

연도를 선택하지 않고 한 달을 선택하는 옵션을 방해하고 싶습니다. 그러나 달이 비었을 때보기에서 NullReferenceException 문제를 어떻게 해결할 수 있습니까? – CiccioMiami

+0

내 답변에 명시된 바와 같이 액션의 달을 다시 채워야합니다. 그렇지 않으면 항상 null이됩니다. 포스트 콜 사이의 상태가 유지되지 않습니다. – Iridio