Asp.Net Mvc Formcollection Hakkında
-
çünkü ekranda herhangi bir şekilde bunun karşılığı yok ekranda ne varsa form sana post ederken sadece onları post eder ya mevcutta bir nesneyi değişkende tut yada ekrana o görüntülemek istemediğin değerleri hidden field ile yazdır ki form sana tekrar objeyi dönerken o değerleri verebilsin
-
Aynen abi bende onu diyorum :) bunu peki en doğru şekilde nere tutabilirim manipule edilmesini istemediğim alanlar session harici pekte bir olanak yok herhalde.
-
ajax kullan ?
-
genel olarak kullanılan yöntem veritabanında ki bir obje ise tekrardan veriyi veri tabanından çekip kullanmandır. yok veri tabanına kaydetmeyeceğin geçici bir verisi ise global bir değişken tanımlayıp o değişken üzerinde saklayabilirsin oda olmadı cache e atabilirsin. hidden field üzerinde tutarsan veri client tarafında değiştirilip post edilebilir veya bozulabilir, riskli bir veri ise hiç bu yönteme başvurma ama bir önceki sayfada yine kullanıcıdan aldığın senin için herhangi birşey değiştirmeyecek bir veri ise bu yöntemi tercih edebilirsin daha kullanışlı ve anlamlı olur. Bu tip işlemler için session pek tercih edilmez. viewbag türevi kullanımlarda tek taraflıdır, action methoda veri dönmezler.
-
Ne farkedecek ki o zaman hocam ? O parametrelerde gidecekmi gidecekse manipule edilebilir olacaktır diye düşünüyorum. ?
-
LuCiFeR bunu yazdı
Aşağıdakilerden bold olanları ekrana @Html.TextBoxFor(q => q.Rooms[i].Passangers[iAdult].Passport) şeklinde yazdırıyorum
ama ekrana yazdırmadıgım yani html çıktısını almadıgım Total ve HotelId gibi değerler post edilince controllerda null görünüyor.
public List RoomInfo { get; set; }
public List Rooms { get; set; }
public decimal Total { get; set; }
public int HotelId { get; set; }
Mantıken ekranda olmayan alanlar, postlanınca da null olarak döner. Bunun önüne geçmek için o alanları formda (eğer güvenli ise) Html.HiddenFor içinde tutabilirsin, geri postlandığında tüm objen dolu gelir.
Bu şekilde yapmayacaksan da, o zaman sadece ilgili alanları okursun aldığın nesneden, viewdaki formda kullanmadığın alanlar null olacağından onları kullanmazsın.
-
Marslan bunu yazdı
genel olarak kullanılan yöntem veritabanında ki bir obje ise tekrardan veriyi veri tabanından çekip kullanmandır. yok veri tabanına kaydetmeyeceğin geçici bir verisi ise global bir değişken tanımlayıp o değişken üzerinde saklayabilirsin oda olmadı cache e atabilirsin. hidden field üzerinde tutarsan veri client tarafında değiştirilip post edilebilir veya bozulabilir, riskli bir veri ise hiç bu yönteme başvurma ama bir önceki sayfada yine kullanıcıdan aldığın senin için herhangi birşey değiştirmeyecek bir veri ise bu yöntemi tercih edebilirsin daha kullanışlı ve anlamlı olur. Bu tip işlemler için session pek tercih edilmez. viewbag türevi kullanımlarda tek taraflıdır, action methoda veri dönmezler.
Evet önemli bir veri abi değiştirilmesini istemiyorum tutarı saklayacagım cunku orada, global değişken hiç kullanmadım cachede öyle bunlar bu tarz durumlar için kullanılan kabul görmüş metodlarmıdır hocam yani bu ve benzeri işlemlerde bunlardan mı yararlanılır ?
Edit : Global derken static class larımı diyorsun abi eğer öyleyse ben her oturum / ziyaretçi için benzersiz ayrı tutulmasını istiyorum o yuzden o olmaz sanırım yada nasıl yapılır çok fikir yürütemedim.
LuCiFeR tarafından 18/Ara/14 15:41 tarihinde düzenlenmiştir -
kabul görmüş bir yöntem mi ? tartışılır bu kişiye düşünce tarzına veya kullandığınız yapıya göre kaynaklarınıza göre değişir. ben kendi adıma yorum yapacak olursam bu tip işlemler için session kullanmıyoruz özellikle çok kullanıcı sistemlerde böyle herşeyi sessiona atarsan session şişebiliyor(bu konuda yaşadığım acı tecrübeler var). Ayrıca aynı kullanıcı iki farklı ekranda iki farklı kişi için aynı işlemi yapıyorsa session üzerinde bu çakışmanın kontrolünü yapman gerekir ki bu işlerini iyice karıştırır.
sizin işleme gelirsek
1. tutar eğer netleşmiş bir tutar ise veri tabanına kaydedin bir daha ki sefere işlem yapacağınız zaman veri tabanından çekin (Örn: müşteri işlemleri tamamlanmış bir sonraki ekranda fiyatı etkileyecek bir değişiklik olmayacak tutar hakkında gerekli onaylar alınmış ise veri tabanına kaydedin. )
2. controller içerisinde global değişken tanımlayın action işleminde ihtiyaç duyduğunuz yerde veriyi buradan alıp kullanın controller istek karşılığında oluşturulduğu için başka sayfa başka işlem yapsada çakışma olmaz yanlız burada sayfayı yeniden handle edersen veriyi kaybedersin buna dikkat etmelisin
3. cache yöntemi ile veriyi tutmak için cache işlemide komple sunucu üzerinde olup herkesin erişebildiği bir işlemdir. örn sen "tutar" parametresi ile birşey sakladığın zaman bunu tüm kullanıcıların işlemlerinde okuyabilirsin veya üzerine veri yazabilirsin bunun içinde session ve işlem bilgilerini içerecek (örn : sessionId + müsteriAdi +parametre gibi) şekilde key belirlemen gerekir.
4. session üzerinde tutmak istersen de bir kullanıcı için bir tek session olur sessionda bir key ile bir değer kaydedersen bütün açtığı sayfalarda o kullanıcı o değeri görür yani aynı anda aynı işlemi iki farklı kişi için yapamaz anlamına geliyor. bunun içinde cache için olduğu gibi islemBazlı bir key (örn : müsteriAdi +parametre gibi) kullanman gerekir ve işlem bitiminde bu keyi temizlemen gerekir çünkü sessionda cache gibi zaman aşımı olayı yok kullanıcı oturumu kapanana kadar o veri orada kalır ve uzun süreli işlemlerde session şişer.
5. en basit çözüm olarak veriyi kendine özgü bir şifreleme algoritması ile veya herhangi bir geri dönüşümlü algoritma ile(.Net kütüphanelerinde var araştırırsan bulursun) şifreleyip hidden field içerisinde sayfaya gönderebilirsin tekrar veriyi aldığında şifresini çözer kullanırsın(bu tip işlemler için bu yöntem çok tercih edilir).
Not : ücret ile alakalı işlemlerde en çok kullanılan ve en garanti yöntem işlemler bitip veri tabanına kaydedilirken parametreler ile tekrar ücret hesaplaması yapmandır.
senin işlemin için 5. yöntem bence en basit ve kullanışlı yöntem olur. yine de seçim sana kalmış
-
Hocam ilgin için çok teşekkürler zahmet edip uzun uzun yazmışsın.
Seneryom şu şekilde sisteme kullanıcı üye olarakda olmadanda alışveriş yapabiliyor, oyuzden alacagım bir referans Id yok,
db den almak konusundada şöyle bir düşüncem var post edilmeden önce bir guid referansıyla bunu db e kaydetmek ancak buradada işlem siparişe dönüşmez ise bunu yakalamak lazım.
2. madde de ki controllar değişkeninin çalışma prensibi konusunda bir sorum olacak eğer ben controllerda değişkeni tanımlarsam aynı anda o controllerde işlem yapan başka oturumlarda bu değişken set olur mu yani o değişken sadece o oturuma mı aittir ?
Benim istediğim tutar verisini db e kaydetmeden her oturum için ayrı ayrı tutabilmek ve sonra bu veriyi okuyabilmek.
-
controller bütün kullanıcılar değil session bile değil istek başına oluşturulan bir nesnedir. Hatta istek yapan kişi isteğini yenilemek için sayfayı yenilese değerleri kaybeder o yüzden dedim dikkat etmen gerekir isteği yeniden oluşturup handle etmen verinin kaybolmasına sebep olur.