Soft Delete için DynamicFilter kullanımı

Tablomda isdeleted kolonu true olanların entity framework içinde sorgularda ek bir işlem yapmadan sorgulara bu şartın eklenmesini sağlamak istiyorum. Büyük feyiz kaynağı asp.net boilerplate bunu nasıl yapmış diye bakarken  “EntityFramework.DynamicFilters” isimli nuget paketini kullandığını gördüm. Kısaca bu nasıl imlemente ediliyor dersek nuget ile yüklüyoruz ve context nesnemize aşağıdaki kodu eklememiz yeterli

https://github.com/zzzprojects/EntityFramework.DynamicFilters

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Filter(“IsDeleted”, (IEntity d) => d.IsDeleted, false);
}

Buradaki IEntity benim bütün entity classlarında bulunan ortak atanın interface i. içerisinde Id ,CreateDate,UpdateDate, isDeleted propertyleri tutuyor.

Reklamlar

AutoMapper ile collection esleşmesi yaparken oluşturmak (re-create) değil varolan datayı düzenlemek

Kısaca sorundan bahsedeyim elimde bir entity var ve insert edildiği anda bir çok ek subclass da ekleniyor. Örneğin makale ve makalenin etiketleri gibi. Sorun: AutoMapper varolan bir nesneyi yeni instance veya varolan bir instance üzerinde değiştirerek ekleyebiliyor.

MainModel model= Mapper.Map<MainModel>(entity);

Bu bize yeni MainModel türünde veri dönderir ve map kurallarına göre eslesen alanları doldurur. Modelde olmayan nesneler Default değerleri alır. Edit yaptığımız senaryolarda genelde

Mapper.Map(model, entity);

Kullanırız ki bu bize entity üzerinde sadece modelde olan alanları değiştirme imkanı verir. Ancak sorun şu ki alt sıfırlar için varolanın üzerine ekle gibi bir özellik yok. bu da entity nesnemizde olup modelde olmayan değerlerimizin kaybı anlamına geliyor.

https://dotnetfiddle.net/Vf41J7

Veya gist hali https://gist.githubusercontent.com/mahmut-gundogdu/e545ac1bd9818c400c0a486fd266f47a/raw/2380f08c4bc6a86f0d8a5214a762a654f4b33760/SorununCozumu.cs

Çözümümüz: AutoMapper.Collection nuget paketi. Özetle iki collection arasında eslesme yapıyor ve varolan class diğeri üzerinde değiştererek dönüyor. Böylece sadece model nesnesinde olan değerler etkileniyor diğerleri null veya 0 (yani default değerleri) olmuyor.

https://dotnetfiddle.net/495XGl

veya gist hali https://gist.githubusercontent.com/mahmut-gundogdu/e545ac1bd9818c400c0a486fd266f47a/raw/2380f08c4bc6a86f0d8a5214a762a654f4b33760/SorununTemsil.cs

Angular.Js de binding type değiştirmek. get ve set de tür dönüşümü

Projemde static html de int değer ile atama yapamıyordum. Sorunun temsili:

https://plnkr.co/edit/L2IHDyO9Gp5Xmzv0XULZ

ng-options ile atasaydım sorun olmayacaktı static html olduğu çin modelim string türde ancak ben integer deger atamam ve almam gerekiyor. Kısaca veriyi atarken ve alırken (c# daki get; set; gibi) veriyi convert etmem gerekiyordu.

Ardından directive attribute ünü html nesnemize ekliyoruz.  convert-to-number=”” olarak ve veriyi atarken ve alırken bizim için veriyi dönüştürüyor.

Kaynak: https://weblog.west-wind.com/posts/2015/May/21/Angular-Select-List-Value-not-binding-with-Static-Values

Asp.net MVC Editor Template ile custom Radio Button Group yapımı

Kullanıdığım tasarımda bool ve bazı int değerleri Evet Hayır  radiobutton ile belirli bir formatta göstermek istiyordum. göstermek istiyordum. Bende asp.net EditorTemplates özelliğnden faydalanayım dedim. Pluralsight da “Improving Your MVC Applications with 10 Extension Points” da öğrenmiştim sanırım. Güzeldir izleyin:  https://www.pluralsight.com/courses/mvc-applications-10-extension-points-improving

https://gist.githubusercontent.com/mahmut-gundogdu/172401b0e75ad7dc7e6e6a1a022adb6d/raw/85caf0554230f43835b6a343511a427cf153232b/RadioYesNoOld.cshtml

Bu yeterli ve güzeldi lakin benim bazı değerlerim int (oysa ki 1 veya 0 saklıyor) bende tür madem dinamik bende model type Dynamic yaparım dedim*.

https://gist.githubusercontent.com/mahmut-gundogdu/172401b0e75ad7dc7e6e6a1a022adb6d/raw/85caf0554230f43835b6a343511a427cf153232b/RadioYesNo.cshtml

herşey harika lakin Model True veya false , 0 veya 1 olsun yine de selected olmuyordu. (Hemen akla Javascript ile çözmek geliyor ama) bende madem olmuyor ben kendim set edeyim dedim.

https://gist.githubusercontent.com/mahmut-gundogdu/172401b0e75ad7dc7e6e6a1a022adb6d/raw/85caf0554230f43835b6a343511a427cf153232b/CustomRadioButtonForHelper.cs

ekledim sorun düzeldi.

 

Not: *Dynamic yerine object desem hiç sorun yaşamıyormuşum yazıyı yazdıktan hemen sonra fark ettim. Bu yazı size üzerine yazmaya değer veya okumayadeğer gelmemiş olabilir ancak tam bir öğlede sonramı yedi “neden değer almıyor!”  diye araştırarak. Bende belki faydası olur diye ve unutmayım diye yazdım. Umarım bir faydası olur.

Asp.net MVC tarih formatı dd/mm/yyyy jQuery validation çözümü

Asp.net de model DateTime ise ve clientside validation açık ise otomatik olarak datetime validation uyguluyor ve bu noktada ulu bilge stackoverflow a göre jquery.validation kendi validation sadece en-us göre valide ediyor. Çözümümüz kısaca jquery.validation un date validator unu bypass etmek. Ben projemde zaten kullanıldığı için moment.js kullandım.

Çözüm

$.validator.methods.date = function (value, element) {
return this.optional(element) || moment(value, “DD/MM/YYYY”, true).isValid();
}

Normalde default fonksiyon şu şekilde:

// http://jqueryvalidation.org/date-method/ // http://jqueryvalidation.org/date-method/ date: function( value, element ) { return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() ); },

Kaynak: https://stackoverflow.com/a/18555328/3928982
Kaynak 2: https://www.codeproject.com/Tips/579279/Fixing-jQuery-non-US-date-validation-for-Chrome

AngularJs ile veri değiştiğinde JQuery Plugini güncelleme

Angular js 1.6.x kullanan projemde select2 kullanıyorum. normalde select2 için su modül mevcut: https://github.com/angular-ui/ui-select ancak X bir sebepten kendim yapmam gerekliydi ve attribute olarak çalışmalıydı. Burada mesele angular yaşam döngüsü içinde olmayan üçüncü partı kodlar ile model değiştiğinde anguları senkron etmemizi sağlyan yapıya örnek bir kod. bu trigger model değeri her değiştiğinde score.$watch değişikliği yakalıyor.

 

angular js de değişken ataması sonrası dom render olmasını beklemek

Merhaba angular js ile  select2 kontrolünü model değişince refresh etmek istiyordum. Aslında angularjs için select2 componenti mevcut ama ben @html. DropdownFor ile verilerimi htmle render etmek istedim.  basitçe ng-change de değişimi yakaladım sorun $score.veri = 5; dediğimde bir çevirim (digest)  gerçekleşiyor ve bu cevrim bitmeden $(‘.select2’).trigger(‘change.select2’) dediğimde olmuyor cünkü henüz html yenilenmedi. Bu yüzden dom renderini beklemek için.

$scope.veri=5;
$timeout(function() {
$(‘.select2’).trigger(‘change.select2’)
});

dememiz yeterli. sıfır bekleme ile dom render olduğunda kodumuz çalışacak.