• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Odwołanie do obiektu nie zostało usawione

Object Storage Arubacloud
0 głosów
107 wizyt
pytanie zadane 4 lipca 2019 w C# przez Michał_Warmuz Mądrala (5,830 p.)

Cześć uczę sie ASP.NET i  mam takie pytanie dlaczrgo wysyakuje mi ten błąd skoro wszystko deklaruje wiem ze codzi tu chyba o wstrzykiwanie zależności ale nie mam pojęcia jak to zrobić bardzo prosze o pomoc z góry dziękuje :)

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Sklep.Infrastructure;
using Sklep.Models;
using Sklep.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Sklep.Controllers
{
    public class OrderController : Controller
    {
        private OrderManager orderManager;
        private ApplicationDbContext db;
        private ISessionManager session { get; set; }

        public OrderController()
        {

        }

        public OrderController(ApplicationDbContext db,  ISessionManager session)
        {
            this.db = db;
            this.session = session;
            orderManager = new OrderManager(session, db);
        }


        private ApplicationUserManager _userManager;
        public ApplicationUserManager UserManager
        {
            get
            {
                return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
            }
            private set
            {
                _userManager = value;
            }
        }


        public ActionResult Index()
        {
            var orderItems = orderManager.GetBasket();
            var totalValue = orderManager.GetTotalValue();
            OrderViewModel vm = new OrderViewModel()
            {
                OrderItems = orderItems,
                TotalValue = totalValue
            };
            ViewBag.Amount = orderItems.Count;
            return View(vm);
            
        }

        public ActionResult AddToBasket(int id)
        {
            orderManager.AddToBasket(id);
            TempData["message"] = "Pomyślnie dodano do koszyka";
            return RedirectToAction("Index", "Home");
        }

        public int AmountItems()
        {
            var basketAmount = orderManager.GetAmountBasketItems();
            return basketAmount;
        }

        public ActionResult DeleteFromBasket(int id)
        {
            var orderItems = orderManager.GetBasket();

            var basketItem = orderItems.Find(x => x.ProductId == id);

            if (basketItem.Quantity >= 2)
            {
                basketItem.Quantity--;
            }
            else
            {
                orderItems.Remove(basketItem);
            }

            var totalValue = orderManager.GetTotalValue();
            OrderViewModel vm = new OrderViewModel()
            {
                OrderItems = orderItems,
                TotalValue = totalValue
            };
            ViewBag.Amount = orderItems.Count;
            return RedirectToAction("Index", vm);

        }

        [HttpGet]
        public ActionResult Pay()
        {
            if(Request.IsAuthenticated)
            {
                var userId = User.Identity.GetUserId();
                var user = UserManager.FindById(userId);

                var order = new Order()
                {
                    FirstName = user.FirstName,
                    SecondName = user.SecondName,
                    Adress = user.Adress,
                    City = user.City,
                    ZipCode = user.ZipCode,
                    Phone = user.PhoneNumber,
                    Email = user.Email
                    
                };

                return View(order);
            }
            else
            {
                return RedirectToAction("Login", "Account", new { returnUrl = Url.Action("Pay", "Order") });
            }
        }

        [HttpPost]
        public ActionResult Pay(Order order)
        {
            if(ModelState.IsValid)
            {
                var userId = User.Identity.GetUserId();
                var newOrder = orderManager.CreateOrder(order, userId);


                var user = UserManager.FindById(userId);
                TryUpdateModel(user);
                UserManager.Update(user);

                orderManager.EmptyBasket();

                TempData["message"] = "Dziękujemy za złożenie zamówienia";
                return RedirectToAction("Index", "Home");


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

 

1 odpowiedź

+1 głos
odpowiedź 5 lipca 2019 przez tomek2323 Bywalec (2,050 p.)
wybrane 7 lipca 2019 przez Michał_Warmuz
 
Najlepsza

Jak to asp net mvc 5 to możesz użyć Ninject jak Core to ma już wbudowany mechanizm

w klasie Startup.

 services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

tu masz przykład poszukaj niżej w kodzie ,nie napisałeś jakiego obiektu dotyczy błąd i jaki jest dokładnie :)

 

 public class Startup
    {
       public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }




        public void ConfigureServices(IServiceCollection services)
        {

            //
           

            //
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.AddTransient<IRepository, Repository>();
            services.AddDbContext<AppIdentityDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));


            services.AddIdentity<AppUser, IdentityRole>().AddEntityFrameworkStores<AppIdentityDbContext>().AddDefaultTokenProviders();
           
           

            services.AddMvc();


        }

 

komentarz 5 lipca 2019 przez Michał_Warmuz Mądrala (5,830 p.)

Kurcze jest to MVC 5 i uzyłem ninject to zbindowałem

        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<ISessionManager>().To<SessionManager>();
        }

 

i wtedy wyskakuje cos takiego:

przy próbie zapisu do bazy db.Savechanes();

System.InvalidOperationException: „An entity object cannot be referenced by multiple instances of IEntityChangeTracker.”

using Sklep.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Web;

namespace Sklep.Infrastructure
{
    public class OrderManager
    {
        private ISessionManager session;
        private ApplicationDbContext db = new ApplicationDbContext();

        public OrderManager(ISessionManager session)
        {
            this.session = session;
           
            
        }

        public const string sessionKey = "BasketKey";


        public List<OrderItems> GetBasket()
        {
            List<OrderItems> basket;

            if(session.Get<List<OrderItems>>(sessionKey)==null)
            {
                basket = new List<OrderItems>();
            }
            else
            {
                basket = session.Get<List<OrderItems>>(sessionKey) as List<OrderItems>;
            }
            return basket;
        }

        public void AddToBasket(int productId)
        {
            var basket = GetBasket();
            var basketItem = basket.Find(x => x.ProductId == productId);

            if(basketItem != null)
            {
                basketItem.Quantity++;
            }
            else
            {
                var product = db.Products.Find(productId);
                

                if(product!= null)
                {
                    var newBasketItems = new OrderItems
                    {
                        Product = product,
                        ProductId = productId,
                        Quantity = 1,
                        Price = product.Price
                    };

                    basket.Add(newBasketItems);
                }
            }

            session.Set<List<OrderItems>>(sessionKey, basket);
        }

        public int DeleteFromBasket(int productId)
        {
            var basket = GetBasket();
            
            var basketItem = basket.Find(x => x.ProductId == productId);

            if(basketItem != null)
            {
                basketItem.Quantity--;
                return basketItem.Quantity;
            }
            else
            {
                basket.Remove(basketItem);
            }

            return 0;

        }


        public decimal GetTotalValue()
        {
            var basket = GetBasket();
            return basket.Sum(x => (x.Product.Price * x.Quantity));
        }

        public int GetAmountBasketItems()
        {
            var basket = GetBasket();
            return basket.Sum(x => x.Quantity);
        }


        public Order CreateOrder(Order newOrder, string UserId)
        {
            var basket = GetBasket();
            
            newOrder.DateOfAddition = DateTime.UtcNow;
            newOrder.UserId = UserId;

            


            if (newOrder.OrderItems == null)
                newOrder.OrderItems = new List<OrderItems>();

            decimal basketValue = 0;
            foreach (var item in basket)
            {
                var newOrderItems = new OrderItems()
                {
                    ProductId = item.ProductId,
                    Product = item.Product,
                    Quantity = item.Quantity,
                    Price = item.Price,
                    
                };
                basketValue += (item.Price * item.Quantity);
                newOrder.OrderItems.Add(newOrderItems);
            }

            newOrder.TotalValue = basketValue;
            db.Orders.Add(newOrder);
            db.SaveChanges();

            return newOrder;
        }

        public void EmptyBasket()
        {
            
            session.Abandom();
        }
    }

}

 

komentarz 6 lipca 2019 przez tomek2323 Bywalec (2,050 p.)
Ninject trzeba ustawić w paru miejscach ,dobrze jest to pokazane w książce asp net mvc 5

Adam Freeman kopie latają po necie w pdf często po angielsku ale kod to kod wbij w wyszukiwarkę i łatwo znajdziesz prześledź sobie podrozdział użycie Ninjec z 10 stron naprawdę warto .Potem masz przykład konfiguracji projektu też z użyciem Ninject.

Jeżeli nie uporządkujesz sobie wiedzy na początku co chwile będziesz miał niestety problemy.

A jak ci się spodoba to zainwestuj w używkę unikniesz wielu kłopotów .

Podobne pytania

0 głosów
1 odpowiedź 515 wizyt
0 głosów
0 odpowiedzi 209 wizyt
0 głosów
1 odpowiedź 249 wizyt
pytanie zadane 2 marca 2020 w C# przez Moras Obywatel (1,620 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...