2017-03-29 5 views
-1

Utilisation de ASP.NET MVC avec Entity FrameworkViewData qui n'est pas NULL est à l'origine de l'erreur nullpointer lors du POST

je vidéotex pour afficher des informations qui ne fait pas partie du modèle de la page. Le formulaire contient le modèle fortement typé tandis que les informations client sont affichées en haut à l'extérieur du formulaire. Je peux voir les informations affichées avant de soumettre le formulaire, donc je sais que ce n'est pas nul et même si c'était pour cela que j'aurais une erreur lors de l'envoi du formulaire puisqu'il ne fait pas partie du formulaire?

code provoquant l'erreur

@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

Je suis désolé pour la pile SQL en français, être clair que le @cust est à l'origine du problème ne les @Resources

+0

Utilisez un [ViewModel] (http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc) au lieu de ViewData, le problème a été résolu. Beaucoup pensent que ViewData est un anti-pattern et ne devrait probablement jamais être utilisé de toute façon – Liam

+0

Si votre formulaire ne réussit pas la validation, la page se rechargera. Si vous ne réinitialisez pas les éléments ViewData, ils seront NULL car, comme vous l'avez dit, ils ne font pas partie du formulaire. De plus, si vous ne suivez pas PRG (post, redirect, get) et que vous appelez simplement return View ("myviewname") à partir de votre méthode POST, à nouveau, ViewData sera NULL sauf si vous redéfinissez les valeurs. – Tommy

+0

vous devez recharger ViewData. Voir ceci http://stackoverflow.com/a/43083773/40521 – Shyju

Répondre

0

vous obtenez l'erreur car l'objet cust est NULL. Vous tentez d'accéder à une propriété sur l'objet NULL et d'obtenir le fameux Référence d'objet non définie sur une instance d'un objet erreur

Pourquoi cust objet NULL? Vous définissez la valeur de la variable cust en lisant ViewData["Customer"]. Que se passe-t-il si ViewData["Customer"] n'est pas défini sur une instance CLIENT valide? Vous avez mentionné que vous recevez l'erreur lorsque vous envoyez le formulaire. Cela se produit généralement lorsque vous soumettez le formulaire et dans votre méthode d'action http post, vous revenez à la même vue sans recharger l'élément de dictionnaire ViewData/ViewBag. Par conséquent, la solution consiste à recharger l'objet client dans le dictionnaire ViewData avant de revenir à la vue qui l'utilise.

[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(); 
} 

Rappelez-vous, Http est apatride.

+0

En cas d'opération réussie (sauvegarde/mise à jour des données en db), vous devez rediriger vers une action GET pour suivre le modèle PRG. Voir l'exemple ici http://stackoverflow.com/questions/11209191/how-do-i-include-a-model-with-a-redirecttoaction/11209320#11209320 – Shyju