11 Ekim 2018 Perşembe

MVC Sürecinde Karşılaştığım Problemler

     S.a. Arkadaşlar,
     Bir süredir üzerinde çalıştığım projede kullandığımız ASP MVC konusunda yaşadığım kendimce ciddi problemleri ve onları nasıl hangi kaynaklardan çözdüğümü kısaca bir toparlamak istedim. Zaman zaman çok zorlandığım anlar da oldu. Hem lazım olursa tekrardan dönüp bakmak açısından hem de belki başkalarına yardımcı olur düşüncesiyle bu yazıyı yazıyorum.
     Şununla giriş yapmak bile acı bir tebessüme sebep olacaktır, özellikle frontend çalışan arkadaşlar için. Bazı tarayıcılarda çalışıp bazılarında çalışmaması. Bunun için tabi ki çok şeyler yapılıyor ama maalesef hala bu problemlerle karşılaşılıyor. Bu da onlardan biri.

    An invalid form control with name='XXX' is not focusable. 

    Buradaki hatanın temeli görünmeyen bir componenti gizlemeye çalışıyor olmamızdı. Chrome'de karşılaştığımız bu hatayı Safari sorunsuz çalışıyordu. Daha sonra bu konuyu araştırdığımızda karşımıza bu linkler çıktı ve konuyu çözdük.

Stack Overflow
Stack Overflow
Github
-----

     En çok sinirimi bozan problem aşağıdaki problem oldu diye hatırlıyorum. Belki de yazıyı yazmama da vesile olan problemdir. Bu açıdan bakınca o kadar da kötü değilmiş aslında :) 

    The model of type 'XYZ' could not be updated” when using UpdateModel and LINQ to Entities
    Bu problemle karşılaştığımda en çok moralimi bozan şey, kodun üzerinde bir değişiklik yaptığımı hatırlamadan karşılaşmış olmamdı. Problem de çok genel olduğu için sorunu çözmek de maalesef çok zorlaşıyor. Tam da yeni başladığım dönemlere denk geldiği için fazladan uğraştım ve bunun sonucunda da epey terlemiştim. Bu problemi ilk başta try model metodu ile çözdüm. Daha sonra  UpdateModel metodu ile çözdüm.

string[] includeProperty = { uye.Xyz,uye.Jkl};
UpdateModel(uye, includeProperty);

     Bundan daha iyisi ise repository kullandığım projede add metodunu kullanmak oldu. Dediğim gibi ilk başlarda karşılaştığım için zorlandım. Soran birileri olmaması da maalesef bazen böyle yorulmalara sebep olabiliyor.
----

     Projede Entity Framework kullanıyoruz. Yaptığım migration sonrası proje arkadaşımda değiştirdiğim alan ile ilgili sıkıntı yaşıyorduk. Her defasında commit etmek vs gerekiyordu projeyi. Ölümcül bir şey değildi ama yine de sinir bozucuydu, fakat bu problemi çözmesi o kadar da uzun sürmedi açıkçası.


Database.SetInitializer<YourDbContext>(null);

      Buradan daha ayrıntılı bilgi alabilirsiniz.

---

    Bu bir hata değil ama karşılaştığım bir problemi güzel bir şekilde nasıl halledebilirim diye üzerinde kafa yorduğum bir şeydi. Json Result ve Action Result nedir , aralarında ne gibi farklar vardır diye bir araştırmak istedim. Jquery tarafından gelen kodun ajax olup olmamasına göre yönlendirme yapmam lazımdı. Bunu aşağıdaki şu kod parçasıyla çözdüm. Ayrıca sonradan öğrendim ki action result hepsinin üst sınıfıymış. Bunu öğrenmek taşları iyice yerine oturttu.


if (Request.AcceptTypes.Contains("json"))
    return Json(vm);
else
    return view(vm);

  Daha ayrıntılı bilgi için buraya bakabilirsiniz.

-------

     Model item passed into the dictionary is of type 'LmsMvc.Models.XxxVM', but this dictionary requires a model item of type 'LmsMvc.Models.YyyVM'

     Burada hata aslında anlaşılır. Ne demek istendiği anlaşılıyor açıkçası. Ama benim problemimin büyümesinin sebebi layout kısmında Üye model view'i kullanırken , yeni oluşturduğum contorller'de başlık model view'i kullandım, view'de de başlık model view kullandığım için hatayı bir türlü göremedim. Yani layouttan kaynaklandığını akıl edemedim maalesef. Daha sonra bunu da şöyle çözdüm. Layouttaki her yerde kullanabilmem için base bir classa çıkardım. Daha sonra layout kısmında base olan model viewi kullandım. Böylece hem yapım bozulmadı, hem de istediğim model viewi istediğim controller'da kullanabildim. Daha fazla ayrıntı için lütfen bakınız.
---
    
     Where In ilişkisi

     Sorgularımda linq kullanıyorum. Zaman zaman where içinde in yapısı kullanmam gerekiyordu. Bunun için oldukça zorlanıyordum. Linq içinde direk böyle bir şey yok bildiğim kadarıyla. Bir araştırma yaptım ve bunun için extension yazan bir arkadaş gördüm :) Siz de eğer yararlanmak isterseniz buradan inceleyebilirsiniz.
-----

     An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll but was not handled in user code hatası

      En sinir olduğum problemlerden biri de bu oldu. Bu tür hatalar çok geniş kapsamlı. O yüzden aradığınızı bulmak cidden çok zor oluyor. Araştırmalar yaptığımda "mikrosoftun bu hatayı kabul edip 2013 2.güncellemede düzelttiği söyleniyordu fakat bende hala hata veriyordu maalesef" diye notumu almışım daha önceden. Buraya da göz atabilirsiniz bu konuyla ilgili. Ama benim problemim biraz dikkatsizlikten kaynaklanıyormuş. Görünce çok kızdım kendime, ama bunlar oluyor hayatta. Kod içerisinde @ViewBag.ViewBag yazmışım. Bu hatanın kötü yanlarından biri de kodun patladığı belirsiz oluyor. Yani örnek veriyorum 5.satırda kod patlıyor. 5.satırı siliyorsunuz 6.satırda kod patlıyor. Neden neden diye dönüp duruyorsunuz. Ama bu tür hatalarda artık direkt olarak aklıma ViewBag kullanımı geliyor. Bazen ViewBag null olduğunda da bu hatayı veriyor. Bu da aklınızda bulunsun. Bununla ilgili bu hatayla da karşılaşabilirsiniz

App_Web_dsykuwlq.dll but was not handled in user code

   Bazen de null referans exception patlayabiliyor. Dediğim gibi  ViewBag yapısını kullanmışsanız lütfen ilk baktığınız yer oralar olsun :) 
-----------


static types cannot be used as parameters in htmlhelpers

    Yine dikkatsizlikle karışık bir hata. Extentions metodlar oluşturmak için bir class oluşturdum ve ismine htmlhelper verdim fakat c# classıyla aynı ismi verdiğimi düşünüp hata veriyordu doğal olarak. Ama bu hata farklı şeylerden de meydana gelebiliyor. Aşağıdaki linki inceleyebilirsiniz.
---

Ajax kodlarında 2kez çalışma

    Ajax kullandığım bir partial view içerisinde metod 2 defa tetikleniyordu. Bunun sebebini anlamaya çalıştım. Hem partial view içersinde hem ana view'de çağırdığımı fark ettim. Partial view'deki kısımları silince problem de düzelmiş oldu. (Bazen layouttan bile referans veriyor olabilirsiniz. Buna da ayrıca dikkat etmenizde fayda var.)
<script src="~/Scripts/jquery-1.10.2.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>


    Ayrıntılı bilgi için buraya bakabilirsiniz.
---


How to use Convert.Int32() method in LINQ to Entities Join?

   Sorgularımda linq kullandığımı söylemiştim. Burada da linq içinde X.ToString() ve kendi extension metodlarım olan X.GetInt() gibi metodlar kullanınca hata veriyordu. Bu sayfaya bakarsanız ne demek istediğimi daha iyi anlayacaksınız. Bunu çözmek için öncelikle dışarıda cast işlemini yapıp daha sonra linq içine yazmamız gerekiyordu, fakat bu da her defasında bir değişken tanımlamak anlamına geliyordu ve kodda hoş gözükmediği oluyordu. Daha sonra araştırdım ve şurada güzel bir çözüm önermişler. Bunun için AsEnumrable() kullanırsak bunu çözeceğini söylemiş bir arkadaş ve gerçekten de iş gördü :)
---

    Şimdi tekrar dönüp baktığımda bu hatalar bana basit geliyor, fakat ilk karşılaştığımda ne kadar da zorlanmıştım. Size de böyle düşündüren problemler oluyorsa aşağıya ekleyelim ki güzel bir içerik oluşur belki bu sayede. Tabi ki temennim en az problemle karşılaşıp yolunuza devam etmenizdir. İyi şanslar.

Hiç yorum yok:

Yorum Gönder