Soran
Mvc Sepete Ürün Eklerken NullReference hatası

Soru
-
İyi günler. Ben mvc de yeniyim ve bir uygulama yapmaya çalışıyorum. Ürün listesinde Sepete Ekle linkine tıklayarak herhangi bir sayfaya yönlenmeden sadece ürünleri sepete eklemeye çalışıyorum. Kodlarım şu şekilde:
View sayfası: (Bu sayfadaki sepete ekle linkine basılınca işlem yapılsın istiyorum)
@model IEnumerable<SistemDeneme.Models.Urun> @{ ViewBag.Title = "Index"; } <h2>ÜRÜNLER</h2> <p> @Html.ActionLink("Yeni Oluştur", "Create") </p> <table class="table"> <tr> <th> @Html.DisplayName("Ürün Adı") </th> <th> @Html.DisplayName("Kategori") </th> <th> @Html.DisplayName("Marka") </th> <th> @Html.DisplayName("Fiyat (TL)") </th> <th> @Html.DisplayName("Stoktaki Miktar") </th> <th> @Html.DisplayName("Eklenme Tarihi") </th> <th> @Html.DisplayName("Açıklama") </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.urunAdi) </td> <td> @Html.DisplayFor(modelItem => item.kategori) </td> <td> @Html.DisplayFor(modelItem => item.marka) </td> <td> @Html.DisplayFor(modelItem => item.birimFiyati) </td> <td> @Html.DisplayFor(modelItem => item.stoktakiMiktar) </td> <td> @Html.DisplayFor(modelItem => item.eklemeTarihi) </td> <td> @Html.DisplayFor(modelItem => item.aciklama) </td> <td> @{ if (User.IsInRole("Admin")) { @Html.ActionLink("Düzenle", "Edit", new { id = item.Id }); @Html.ActionLink("Ayrıntılar", "Details", new { id = item.Id }); @Html.ActionLink("Sil", "Delete", new { id = item.Id }); } else { @Html.ActionLink("Ayrıntılar", "Details", new { id = item.Id }); @Html.ActionLink("Sepete Ekle", "SepeteEkle", new { id = item.Id } ); } } </td> </tr> } </table>
Controller'daki metotum:
publicvoid SepeteEkle(int? id, Sepet sepet) { var urun = (from i in db.Urunler where i.Id == id select i).FirstOrDefault(); if (ModelState.IsValid) { sepet.Urunler.Add(urun); *** db.Sepetler.Add(sepet); db.SaveChanges(); }
*** satırında nesne başvurusu bir nesnenin örneğine ayarlanmadı hatası alıyorum. Breakpoint ile kontrol ettim, urun değeri null değil ancak nesne Urun tipinde olması gerekirken System.Data.Entity.DynamicProxies.ProjectDetails_########### (bazı numaralar) şeklinde.
Neyi yanlış yapıyorum anlayamadım. Bu konuda yardımcı olabilirseniz çok sevinirim.
Tüm Yanıtlar
-
Sn. gamze2709
var urun = (from i in db.Urunler where i.Id == id select i).FirstOrDefault();
kısmında gelen veriyi ekrana bastırıp ne geldiğini gormeniz gerekiyor. Tahminim array gelir ve bu yüzden sepete eklerken sayı olması gereken yerde array döndüğü için hata alıyorsunuz.
Birinin cevabı size yardımcı oldu ise, lütfen "Yanıt Olarak Öner" veya "Yanıt Olarak İşaretle" olarak işaretlemeyi ve "Oy" vermeyi unutmayınız. Burada sağlanan tüm görüşler, kişiseldir ve Microsoft'un konumunu temsil etmemektedir. Tüm bilgiler hazır olarak temin edilmektedir ve herhangi bir garanti vermemektedir.
-
SepeteEkle'deki id parametresi null veya veri tablosunda olmayan bir id değeri alıyor olmalı.
public void SepeteEkle(int? id, Sepet sepet) { if (id != null) { var urun = (from i in db.Urunler where i.Id == id select i).FirstOrDefault(); if (ModelState.IsValid && urun != null) { sepet.Urunler.Add(urun); *** db.Sepetler.Add(sepet); db.SaveChanges(); } } }
Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...
-
var urun = (from i in db.Urunler where i.Id == id select i).FirstOrDefault();
sepet.Urunler.Add(urun);
diyorsanız oraya bir ürün göndermelisiniz. çünkü ekleme işlemi yapıyorsunuz.
"var urun = ..." şeklinde olmaz.
var
urun = (from i in db.Urunler where i.Id == id select i).FirstOrDefault();
breakpoint koyup bakın bakalım o satırda gerçekten bir ürün nesnesi mi dönüyor.
- Düzenleyen Ensar KARTAL 26 Ağustos 2017 Cumartesi 01:12
-
O satırda null olabilecek üç adet nesne var;
1-) sepet
2-) sepet.Urunler isimli koleksiyon
3-) uruneğer urun null ise db.Urunler tablosunda belirttiğiniz id ile eşleşen bir kayıt yani ürün yok demektir. Diğer null olabilecek nesneler için de breakpoint koyarak adım adım kodu çalıştırmak lazım. sepet.Urunler isimli koleksiyonu "new" anahtar kelimesi ile türetmiyor olabilirsiniz. sepet null geliyorsa SepeteEkle isimli fonksiyonu çağırdığınız yerde sepet değişkenine gönderdiğiniz nesneyi kontrol edin.
.Net Developer
- Düzenleyen Aykut DEMİRCİ 26 Ağustos 2017 Cumartesi 14:47
-
var urun = (from i in db.Urunler where i.Id == id select i).FirstOrDefault();
sepet.Urunler.Add(urun);
diyorsanız oraya bir ürün göndermelisiniz. çünkü ekleme işlemi yapıyorsunuz.
"var urun = ..." şeklinde olmaz.
var
urun = (from i in db.Urunler where i.Id == id select i).FirstOrDefault();
breakpoint koyup bakın bakalım o satırda gerçekten bir ürün nesnesi mi dönüyor.
.Net Developer