2009-12-10 6 views
0

Je reçois cette erreur lorsque j'appelle l'action d'édition de l'un de mes contrôleurs.Html.TextBox() throws System.NullReferenceException

Voici le code C# de la méthode d'action Edit

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(cedetails detailToEdit) 
    { 
     validateDetail(detailToEdit); 
     if (!ModelState.IsValid) 
      return View(); 

     try 
     { 
      var originaldetail = (from d in entity1.cedetails 
            where d.detail_id == detailToEdit.detail_id 
            select d).FirstOrDefault(); 
      entity1.ApplyPropertyChanges(originaldetail.EntityKey.EntitySetName, detailToEdit); 
      entity1.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

Ceci est la validateDetail Méthode:

protected void validateDetail(cedetails detailToValidate) 
{ 

    if (detailToValidate.c_name.Trim().Length == 0) 
     ModelState.AddModelError("c_name", "C name is required."); 
     ModelState.SetModelValue("c_name", ValueProvider["c_name"]); 
    if (detailToValidate.a_server.Trim().Length == 0) 
     ModelState.AddModelError("a_server", "A server is required."); 
     ModelState.SetModelValue("a_server", ValueProvider["a_server"]); 
    if (detailToValidate.d_server.Trim().Length == 0) 
     ModelState.AddModelError("d_server", "D server is required."); 
     ModelState.SetModelValue("d_server", ValueProvider["d_server"]); 
    if (detailToValidate.l_server.Trim().Length == 0) 
     ModelState.AddModelError("l_server", "L server is required."); 
     ModelState.SetModelValue("l_server", ValueProvider["l_server"]); 
    if (detailToValidate.url.Trim().Length == 0) 
     ModelState.AddModelError("url", "URL is required."); 
     ModelState.SetModelValue("url", ValueProvider["url"]); 
    if (detailToValidate.s_id.Trim().Length == 0) 
     ModelState.AddModelError("s_id", "S ID is required."); 
     ModelState.SetModelValue("s_id", ValueProvider["s_id"]); 
} 

Je reçois l'erreur dans cette ligne:

<%= Html.TextBox("c_name", Model.c_name) %> 

Détails de l'exception: System.NullReferenceException: Object referen ce n'est pas une instance d'un objet.

J'ai cherché cette erreur et est arrivé sur plusieurs solutions, mais aucun d'eux n'a fonctionné pour moi. S'il vous plaît laissez-moi savoir si cela peut être résolu du tout. J'ajouterai aussi que j'ai choisi de cacher certaines colonnes de la table, y compris detail_id, en ne les affichant pas.

+0

Presque tous les cas de 'NullReferenceException' sont identiques. S'il vous plaît voir "[Qu'est-ce qu'une NullReferenceException dans .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)" pour quelques conseils. –

Répondre

2

Est-ce que votre action d'index définit le modèle? l'action d'édition ne fonctionne nulle part, donc si le Modèle n'est pas défini dans l'action Index (ala return View (cedetials)) alors le Modèle sera nul.

+0

Oui, le modèle est défini dans l'index comme ceci: return view (entity1.cedetails.ToList()); – Animesh

0

Je pense que blue_fenix a sa place dans sa réponse. il semble que vous n'êtes pas spécifier le modèle ici:

if (!ModelState.IsValid) 
      return View(); 

Et ici:

catch 
     { 
      return View(); 
     } 

Vous devez retourner le modèle, parce que le HTML est Textbox Helper spectating un modèle qui ne peux pas être nul. Dans chaque cas, essayez de renvoyer le même modèle lié:

return View(detailToEdit); 
+0

Salut, Je comprends maintenant ce que signifiait blue_fenix. J'ai changé la méthode d'action pour renvoyer le modèle dans chaque déclaration de retour et maintenant je n'obtiens pas l'erreur, mais la page se publie au lieu de rediriger vers l'index et le changement n'est pas reflété dans la base de données. Lorsque je débogue la méthode d'édition et «étape dans» j'ai remarqué que entity1.ApplyPropertyChanges (originaldetail.EntityKey.EntitySetName, detailToEdit); cette instruction n'est pas intervenue dans et il va directement à l'instruction catch qui donne la même exception: Référence d'objet n'est pas définie à une instance d'un objet – Animesh

+0

Il est difficile de dire ce qui va mal, parce que je ne sais pas quoi ApplyPropertyChanges est en train de faire, il semble que sur ces deux paramètres sont null (le plus probablement originaldetail). Une chose que je ne comprends pas est pourquoi vous envoyez "originaldetail.EntityKey.EntitySetName" au lieu de seulement "originaldetail" qui semblent être du même type que "detailToEdit". – JOBG

+0

La méthode ApplyPropertyChanges prend entitySetName et l'objet est modifié en tant que paramètres. Je l'ai essayé comme vous l'avez dit, mais cette méthode n'a pas d'autres surcharges. Je suis en train de suivre cette voie à partir de l'exemple de gestionnaire de contacts ASP.NET MVC donné sur le site. – Animesh

Questions connexes