none
Mvc Sepete Ürün Eklerken NullReference hatası RRS feed

  • 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.

     

    23 Ağustos 2017 Çarşamba 11:50

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 gerekiyorTahminim array gelir ve bu yüzden sepete eklerken sayı olması gereken yerde array döndüğü için hata alıyorsunuz.

    Projenizde başarılar dilerim.



    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.

    24 Ağustos 2017 Perşembe 09:31
    Moderatör
  • 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...

    24 Ağustos 2017 Perşembe 09:56
  • 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.




    26 Ağustos 2017 Cumartesi 01:07
  • O satırda null olabilecek üç adet nesne var;

    1-) sepet
    2-) sepet.Urunler isimli koleksiyon
    3-) urun

    eğ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


    26 Ağustos 2017 Cumartesi 14:45
  • 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.




    "var urun=..." şeklinde olur çünkü eşitliğin sağ tarafındaki sorgudan dönen nesnenin bir tipi vardır. Eğer sizin bahsettiğiniz gibi oradan dönen değer bir urun değilse daha uygulamayı debug etmeden sepet.Urunler.Add(urun); satırında tip uyumsuzluğu hatası verir. Null reference exception fırlatmaz

    .Net Developer

    26 Ağustos 2017 Cumartesi 14:50