2012-04-01 2 views
0

을 ... 던지는 DropDownListFor 여기에 무슨 일이 일어나고 있는지 확실하지 경우 ArgumentNullException

내 컨트롤러 방법

은 다음과 같습니다

[HttpGet] 
public ActionResult RequestAppointment() 
{ 
    var appointmentRequest = new AppointmentRequest 
    { 
     Stylists = _repository.Stylists // <-- Debugging shows that Stylists IS being populated here 
    }; 

    return View(appointmentRequest); 
} 

[HttpPost] 
public ActionResult RequestAppointment(AppointmentRequest appointmentRequest) 
{ 
    if(ModelState.IsValid) 
    { 
     // Process... 
     return RedirectToAction("Confirmation"); 
    } 
    return View(appointmentRequest); 
} 

을 양식은 다음과 같습니다 다운 목록

@model MyDomain.Models.AppointmentRequest 

@using(Html.BeginForm("RequestAppointment", "Appointment" FormMethod.Post)) 
{ 
    // This following line throws the exception: 
    @Html.DropDownListFor(x => x.Stylist, 
     Model.Stylists.Select(x => new SelectListItem{ Text = x.Name, Value = x.Name }))) 

    <input type="submit" value="Make Request" /> 
} 

드롭 올바른 텍스트 & 값이있는 채워진 양식입니다. 그러나 양식이 제출되면 예외가 발생합니다. 무슨 일이야?

스택 추적은 :

[ArgumentNullException: Value cannot be null. 
Parameter name: source] 
    System.Linq.Enumerable.Select(IEnumerable`1 source, Func`2 selector) +6396316 
    ASP._Page_Views_Appointment_RequestAppointment_cshtml.Execute() in c:\Projects\OasisSalon\OasisSalon.Mvc\Views\Appointment\RequestAppointment.cshtml:9 
    System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +280 
    System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +104 
    System.Web.WebPages.StartPage.ExecutePageHierarchy() +143 
    System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +157 
    System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +384 
    System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +33 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +825460 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +265 
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +825488 
    System.Web.Mvc.Controller.ExecuteCore() +159 
    System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335 
    System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62 
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20 
    System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +54 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +469 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375 
+0

스택 추적을 읽습니다. 양식을 제출할 때 실행되는 코드는 표시하지 않았습니다. – SLaks

+0

@SLasks, 스택 트레이스가 있습니다 – Didaxis

+0

예외적으로 'Stylist'가'null'인 것처럼 보입니다. – BrokenGlass

답변

1

당신은 당신의 POST 액션의 Stylists 속성을 초기화해야 POST 작업을 실행 한 후에는이 속성이 null이고 POST 요청으로 보낸 모든 값이 드롭 다운 목록 (Stylist 속성)의 선택된 값이기 때문에 해당 값이 자동으로 채워지지 않습니다.

+1

다른 답변이 동일한 아이디어로 반복 되더라도이 대답은 정확한 해결책을 가장 분명하게 보여줍니다. 덕분에 다시 Darin! 당신은 MVC 마법사입니다! – Didaxis

3

내 심령 디버깅 기술은 모델을 생성하지 않고 POST 액션에서 View()를 반환하고 말해.

+0

@Slasks, POST 메소드의 구현을 더 추가했습니다. – Didaxis

+1

@ErOx : 제 정신력은 대부분 정확하다. POST의 모델 바인딩 모델에는 '스타일리스트'가 없습니다. – SLaks

+0

네가 맞았다. 고마워요 – Didaxis

1

ASP.NET MVC에는 ViewState가 없습니다. 따라서 ASP.ENT Webforms와 같은 포스트 백을 통해 DropDown 값 목록을 유지할 수는 없습니다. 그래서 나는 HttpPost Action 메서드에서 appointmentRequest을 View로 반환 하겠지만 Stylists 속성은 null이라고 생각합니다. appointmentRequest을 다시보기 전에 다시로드해야 할 수도 있습니다.

+0

전에 그걸 할 필요가 없었어요 ... 모델이 POST 버전에 주어지면 모든 값은 그대로 유지됩니다, 그렇지 않습니까? – Didaxis

+0

@ErOx : 드롭 다운 요소의 사용 가능한 옵션은 사후 조치 방법에서 사용할 수 없습니다. 선택한 항목, TextBox 값 etx sice의 값을 가져옵니다. HTML 도우미는 HTML 항목을 저장하기 위해 숨겨진 변수를 만듭니다. – Shyju

1

여기서 일어나는 일은 Stylists이 게시 작업에서 null이라는 것입니다. 드롭 다운 목록은 Stylist (Stylists 제외)이므로 모델 바인딩 중에 바인딩되지 않습니다.

appointmentRequest 모델을보기에 전달하기 전에 Stylists 속성을 다시 작성해야합니다.

[HttpPost] 
public ActionResult RequestAppointment(AppointmentRequest appointmentRequest) 
{ 
    if(ModelState.IsValid) 
    { 
     // Process... 
     return RedirectToAction("Confirmation"); 
    } 

    appointmentRequest.Stylists = _repository.Stylists; 
    return View(appointmentRequest); 
} 

당신이보기에 Model.Stylists를 사용하여보기에서 DropDownList로 렌더링하려고하기 때문에 NRE를 얻을 : 동일한보기를 다시 표시하려는 경우

관련 문제