2017-08-31 2 views
1

J'essaie de remplir mon modèle qui est membre du modèle de vue, J'envoie des données à partir de l'action pour afficher.C'est le travail correct. mais lorsque vous cliquez sur le bouton de sauvegarde, obtenez une erreur quiRemplissez mon modèle de m viewModel en mvc

La référence d'objet n'est pas définie sur une instance d'un objet.

Le modèle de vue est

public class OrderCustomer 
{ 
    public Order Order { get; set; } 
    public ApplicationUser ApplicationUser { get; set; } 
} 

Et l'action pour les données post est

 [HttpPost] 
    public ActionResult AddressAndPayment(OrderCustomer values) 
    { 
     var orderCustomer = new OrderCustomer(); 
     var order = orderCustomer.Order; 

     string uId = User.Identity.GetUserId(); 
     order.Username = User.Identity.Name; 
     order.ApplicationUserId = uId; 
     order.OrderDate = DateTime.Now; 
     order.Address = values.ApplicationUser.Address; 
     order.CityId = (int)values.ApplicationUser.CityId; 
     order.CountryId = (int)values.ApplicationUser.CountryId; 
     order.Email = values.ApplicationUser.Email; 
     order.FirstName = values.ApplicationUser.FName; 
     order.LastName = values.ApplicationUser.LName; 
     order.Phone = values.ApplicationUser.Phone; 
     order.PostalCode = values.ApplicationUser.PostalCode; 
     order.ProvinceId = (int)values.ApplicationUser.ProvinceId; 

     if (ModelState.IsValid) 
     { 

      TryUpdateModel(order); 

      try 
      { 
       _db.Orders.Add(order); 
       _db.SaveChanges(); 
       var cart = ShoppingCart.GetCart(this.HttpContext); 
       cart.CreateOrder(order); 

       return RedirectToAction("Index", "Payment", new { id = order.Id }); 

      } 
      catch 
      { 
       return View(order); 
      } 
     } 
     return View(order); 


    } 

quand débogueur arrive sur ce code montrent la ligne d'erreur 5 dans le code ci-dessus qui montrent en dessous, comment puis-je le réparer?

 order.Username = User.Identity.Name; 
+0

peut-être la demande n'est pas authentifié donc il n'y a pas de jeu d'identité - regardez dans votre code auth ou définir un principe anonyme comme celui-ci https://stackoverflow.com/ questions/2893334/invalidating-asp-net-formesauthentication-côté serveur – mchan

+0

'order' est' null'. vous n'attribuez pas d'instance à cette propriété – Nkosi

Répondre

2

Étant donné que OrderCustomer n'initialise pas Order quand il est initialisé

comme

public class OrderCustomer { 

    public OrderCustomer() { 
     Order = new Order(); 
    } 

    public Order Order { get; set; } 
    public ApplicationUser ApplicationUser { get; set; } 
} 

alors Order serait null par défaut.

Cela signifie que vous créez actuellement une instance de OrderCustomer mais que vous n'attribuez jamais de valeur à la propriété Order.

var orderCustomer = new OrderCustomer(); 
var order = orderCustomer.Order; //<-- Order is null by default 

Ainsi order est null que vous ne donnez pas un objet à cette variable. Donc référez-vous à l'exemple ci-dessus ou assurez-vous de créer une nouvelle instance.

var orderCustomer = new OrderCustomer() { 
    Order = new Order() 
}; 

var order = orderCustomer.Order; 
//...code removed for brevity 

Cependant, cela soulève maintenant la question de savoir pourquoi vous n'êtes pas assignez la valeur de ce qui a été publié dans le cadre du modèle de vue?

Je crois que c'est ce que vous aviez l'intention

var order = values.Order;