2017-03-29 8 views
-1

ASP.NET MVC with Entity FrameworkNULL이 아닌 ViewData가 NULLpointer 오류를 발생시킵니다.

페이지 모델에 포함되지 않은 정보를 표시하기 위해 뷰 데이터를 사용했습니다. 양식에는 강력한 형식의 모델이 들어 있지만 고객 정보는 양식 외부의 맨 위에 표시됩니다. 폼을 제출하기 전에 표시된 정보를 볼 수 있으므로 null이 아니며 양식의 일부가 아니므로 양식을 보낼 때 오류가 발생하는 이유는 무엇입니까?

코드 내가 프랑스어로 SQL 스택에 대해 사과 오류

@model Sondage_Epicier.Models.Sondage_Vendeur 

@{ 
Sondage_Epicier.Models.CLIENT cust = (Sondage_Epicier.Models.CLIENT) 
ViewData["Customer"]; 
} 

<div id="sondage"> 

<div class="subForm" style="margin-bottom: -20px;"> 
    <p class="info">@Resources.numClient2 @cust.NO_CLIENT</p><br /> 
    <p class="info">@Resources.nom @cust.NOM</p><br /> 
    <p class="info">@Resources.address @cust.ADR_1 , @cust.VILLE</p> 
</div> 
@using (Html.BeginForm()) 
{ 
@Html.ValidationSummary(true, "", new { @class = "" }) 
@Html.HiddenFor(model => model.SondageID) 
@Html.HiddenFor(model => model.Date_Envoye) 
@Html.AntiForgeryToken() 

stack trace

을 일으키는 원인이되는 @cust이 문제 @Resources가

+0

ViewData 대신 [ViewModel] (http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc)을 사용하면 문제가 해결됩니다. 많은 사람들은 ViewData가 안티 패턴이라고 생각하며 어쨌든 사용해서는 안됩니다. – Liam

+0

양식이 유효성 검사를 통과하지 못하면 페이지가 다시로드됩니다. ViewData 요소를 재설정하지 않는 경우, 귀하의 말처럼 양식에 포함되어 있지 않기 때문에 NULL이됩니다. 또한 PRG (post, redirect, get)를 따르지 않고 POST 메서드에서 View ("myviewname")를 반환하는 경우 다시 값을 다시 설정하지 않으면 ViewData가 NULL이됩니다. – Tommy

+0

ViewData를 다시로드해야합니다. 이것 참조 http://stackoverflow.com/a/43083773/40521 – Shyju

답변

0

당신은 점점되지 원인이 명확하기 cust 개체가 NULL이기 때문에 오류가 발생했습니다. NULL 객체의 속성에 액세스하려고하고 유명한 객체를 참조하려고합니다. 객체 참조가 객체의 인스턴스로 설정되지 않았습니다. 오류

cust 객체가 NULL입니까? 변수 cust의 변수 값을 ViewData["Customer"]으로 설정합니다. ViewData["Customer"]이 유효한 CLIENT 인스턴스로 설정되지 않으면 어떻게 될까요? 양식을 제출할 때 오류가 발생한다고 언급하셨습니다. 일반적으로 양식을 제출하면 http post 조치 메소드에서 ViewData/ViewBag 사전 항목을 다시로드하지 않고 동일한보기로 돌아갑니다.

그래서 해결책은 고객 개체를 사용중인보기로 돌아 가기 전에 ViewData 사전에 다시로드하는 것입니다.

[HttpPost] 
public ActionResult Save(SomeViewModel model) 
{ 
    //your existing code 
    // here i am creating a new object and assigning it. 
// Replace with your code which you use in the GET action 
    var customer = new Sondage_Epicier.Models.CLIENT(); 
    ViewData["Customer"] =customer; 
    return View(); 
} 

기억 HTTP는 비 상태입니다.

+0

성공적인 작업 (db의 데이터 저장/업데이트)에서 PRG 패턴을 따르려면 GET 작업으로 리디렉션해야합니다. 여기 샘플을 참조하십시오 http://stackoverflow.com/questions/11209191/how-do-i-include-a-model-with-a-redirecttoaction/11209320#11209320 – Shyju