2009-12-31 2 views
0

Quelqu'un peut-il expliquer pourquoi l'objet modèle est null. J'ai vérifié les valeurs de poteau traversant le fil et tous sont remplis. En utilisant VS2010 Beta 2, WinXp SP2, mais cela fonctionne dans VS2008 ?? !!Erreur lors de la publication des données d'édition dans ASP.NET MVC

écran jaune du message mort

Server Error in '/' Application. Object reference not set to an instance of an object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

Line 17:    <p> 
Line 18:     <label for="id">id:</label> 
Line 19:     <%= Html.TextBox("id", Model.id) %> <--Error 
Line 20:     <%= Html.ValidationMessage("id", "*") %> 
Line 21:    </p> 

code contrôleur

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(Contact contactToEdit) 
    { 
     if (contactToEdit.FirstName.Trim().Length == 0) 
      ModelState.AddModelError("FirstName", "First name is required."); 
     if (contactToEdit.Lastname.Trim().Length == 0) 
      ModelState.AddModelError("LastName", "Last name is required."); 
     if (contactToEdit.Phone.Length > 0 && !Regex.IsMatch(contactToEdit.Phone, @"((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}")) 
      ModelState.AddModelError("Phone", "Invalid phone number."); 
     if (contactToEdit.Email.Length > 0 && !Regex.IsMatch(contactToEdit.Email, @"^[\w-\.][email protected]([\w-]+\.)+[\w-]{2,4}$")) 
      ModelState.AddModelError("Email", "Invalid email address."); 

     if (!ModelState.IsValid) 
      return View(); 
     try 
     { 
      // TODO: Add update logic here 
      var con = (from c in _entities.Contacts 
         where c.id == contactToEdit.id 
         select c).FirstOrDefault(); 
      _entities.ApplyCurrentValues(con.EntityKey.EntitySetName, contactToEdit); 
      _entities.SaveChanges(); 


      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

Snippet de vue Code

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<JQGallery.Models.Contact>" %> 
... 
<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %> 

<% using (Html.BeginForm()) {%> 

    <fieldset> 
     <legend>Fields</legend> 
     <p> 
      <label for="id">id:</label> 
      <%= Html.TextBox("id", Model.id) %> 
      <%= Html.ValidationMessage("id", "*") %> 
     </p> 
     <p> 
      <label for="FirstName">FirstName:</label> 
      <%= Html.TextBox("FirstName", Model.FirstName) %> 
      <%= Html.ValidationMessage("FirstName", "*") %> 
     </p> 
     <p> 
     ... 

Répondre

0

L'objet Model est null car vous ne le définissez pas. Dans votre méthode de contrôleur POST, aucun des résultats d'affichage que vous renvoyez ne définit un modèle (après la ligne if (!ModelState.IsValid) et dans votre bloc catch). Dans les deux cas, vous devez recharger votre modèle de sorte que la vue puisse réafficher ses données.

+0

Cela n'est pas vrai, en fait, à cause de la liaison de modèle. Vérifiez ici pour plus d'informations: http://www.asp.net/learn/mvc/tutorial-36-cs.aspx –

+0

La liaison de modèle instancie et définit les propriétés de l'argument contactToEdit dans la méthode Edit de l'OP en utilisant les valeurs de formulaire soumises. Il n'instancie pas et ne remplit pas l'objet Model disponible pour sa vue. (Les exemples de votre lien de didacticiel fonctionnent uniquement avec la méthode View() car cet exemple particulier n'essaie pas d'accéder à l'objet Model.) –

+0

En fait, je vous ai envoyé un lien vers l'action Créer uniquement, mais la modification fonctionnera dans de la même manière: http://www.asp.net/%28S%28pdfrohu0ajmwt445fanvj2r3%29%29/learn/mvc/tutorial-28-cs.aspx - L'idée est que depuis que le modèle a été POSTé à l'action , la liaison du modèle le repousse vers le navigateur lorsque l'action revient simplement à la vue. –

0

Avez-vous une action de contrôleur qui accepte les verbes non post et ensembles le modèle pour votre vue? Le modèle sera null si vous accédez directement à la vue sans une méthode Action qui répond à une requête GET et remplit le modèle.

Par exemple, votre action régulière pourrait être quelque chose comme

// 
// Reponds to: GET /Contact/Edit/5 

public ActionResult Edit(int id) 
{ 
    Contact contactToEdit = GetContactFromDatabase(id); 
    return View(contactToEdit); 
} 

Je ne vois rien de mal à l'action POST, mais vous avez besoin d'une action GET correspondante pour définir le formulaire pour vous.

EDIT: Une autre chose que vous pourriez envisager étant donné que vous utilisez des classeurs de modèle intégrés ASP.NET MVC est que vous devriez probablement exclure l'ID (ou tout champ sensible que l'utilisateur ne devrait pas logiquement pouvoir changer) d'être changé et effectivement le retirer du formulaire (ou au moins le rendre non modifiable). Vous pouvez le faire avec un attribut sur l'objet contact entrant, comme ceci:

// 
// Reponds to: POST /Contact/Edit/5 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit([Bind(Exclude="id")] Contact contactToEdit) 
{ 
    // ... do edit logic/validation stuff 
} 
+0

J'ai une action GET, Il est livré en standard avec la génération de la vue. – D0cNet

+0

Pourquoi cela fonctionnerait-il dans VS2008? – D0cNet

Questions connexes