Kategori arşivi: MVC

MVC Model’inde Nesneyi Validasyon Haricinde Tutmak

Model tasarımında nesnelerinizde validasyonu zorunlu tutabilirsiniz ama form işlemlerinde istediğiniz alanları ModelState Validate kontrolü haricinde tutmak istiyorsanız aşağıdaki örneği inceleyebilirsiniz.

ModelState.Remove("NESNE_ADI");

if (ModelState.IsValid)
{
// Prosedürler
}

ASP.NET MVC’de HTML5 data-* Attributes Kullanımı

MVC’de form controlleri eklerken HMTL5 attributes kullanmak isteyebilirsiniz ama data-* attributes’leri içindeki “-” aritmatik bir operatör olduğu için sayfanız hata verecektir. Proplemi aşmak için “_” çizgi kullanmanız yeterlidir.

Örnek:

@Html.TextBoxFor(model => model.MAIL, new { @class = "form-control", @placeholder = "mail@alanadi.com", @data_required = "email" })

ASP.NET MVC ile Post Edilen Html Kodları (ValidateInput)

MVC ile hazırladığımız sayfalarda CKEditör gibi zengin metin editörü kullanıyorsak, sayfamızı post ettiğimizde aşağıdaki gibi hata alabiliriz.

“[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client…”

Bu hata aslında bir güvenlik önlemi olup, sayfada html ve js kodları yürütmeyi engellemektedir. Eğerki kontrol panelinizde kullanacaksanız metodunuzun üstüne [ValidateInput(false)] attribute belirtmeniz yeterli olacaktır.

MVC Model’deki Date Alanları Proplemi ve Çözümü

Sql Server’da oluşturduğunuz tablodaki date tipindeki alanlarının form kontrollerinde oluşan sorunu çözmek için aşağıdaki js kodunu kullanmanız yeterlidir.

$.validator.setDefaults({ ignore: '.ignore' });
$.validator.methods["date"] = function (value, element) { return true; };
$.validator.methods.range = function (value, element, param) {
var globalizedValue = value.replace(",", ".");
return this.optional(element) || (globalizedValue >= param[0] && globalizedValue <= param[1]);
};

$.validator.methods.number = function (value, element) {
return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value);
};

Ayrıca eğer form elemanınızın kontrol edilmeden atlanmasını istiyorsanız class attribute “ignore” eklemeniz yeterlidir. Örnek

class="ignore"

ASP.NET Cookie Türkçe Karakter Proplemi ve Çözümü

Üzerinde çalıştığım projede session ile yaptığım kısımları cookie olarak değiştirmem gerekiyordu. Düzenlemeden sonra cookielerden gelen değerlerde türkçe karakter problemi olduğu gördüm. Bu sorunu UrlEncode ile çözebilirsiniz ama yazılım sürecini uzatıyor. web.config ile daha kolay bir şekilde çözüme ulaşabilirsiniz.





Çok Katmanlı Mimari (NLayered)

MVC’ye geçiş yaptığım dönemden bu yana Model, View ve Controller katmanları gördükçe kodlarım nedense bana çok karmaşık gelmeye başladı. Kendi kuruntum herhalde dedim ama biraz araştırma yaptıktan sonra analar ne developer doğuruyor demekten kendimi alamadım 🙂

Çok katmanlı mimarı hakkında Microsoft’un best practicelerini incelemenizi tavsiye ederim. Veritabanı işlemleri yapıldığı DAL (Data Access Layer), arayüz ile veritabanı arasındaki işleri yapan BLL (Business Logic Layer) katmanlar hakkında http://msdn.microsoft.com/en-us/library/aa581776.aspx (DAL) ve http://msdn.microsoft.com/en-us/library/aa581779.aspx (BLL) sayfalarını incelemenizi tavsiye ederim.

Bunlar haricinde katmanlar arası veri akışı sağlayabileceğiniz Entities, kendi helperlarınızı tutabileceğiniz Utilities ve verilerinizi dışarıya açmak için Service katmanlarıda oluşturabilirsiniz.

Bu mimari uygulama sürecin uzatsada yapınız mükemmel şekilde hiyerarşik ve modüler hale geliyor. Hele ki takım çalışması olan uygulamalarınız için size kolaylıklar sunuyor.

Katmanlı mimariyi anladıktan sonra, kendimi biraz daha Yazılım Geliştirici olduğumu hissetmeye başladım 🙂

ASP.NET MVC Dosya Yükleme

MVC’de dosya yükleme işlemine göz atacağız.

Projemizde dosya yükleme için controller ve view oluşturduktan sonra, view kısmında dosya yükleme için formumuzu oluşturalım.

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@TempData["sonuc"]
<div>
<input type="file" name="dosya" />
<input type="submit" value="Gönder" />
</div>
}

Controller’da gerekli kodlarımızı yazıyoruz.

[HttpPost]
public ActionResult Index(HttpPostedFileBase dosya)
{
if (dosya != null && dosya.ContentLength > 0)
{
var path = Path.Combine(Server.MapPath("~/upload_klasor"), dosya.FileName);
dosya.SaveAs(path);
TempData["sonuc"] = "Dosya başarıyla yüklenmiştir.";
}
return View();
}

Dosya yüklemek istediğimiz klasöre yazma izni veridikten sonra uygulamamızı çalıştırabilirsiniz.

HttpContext.Session Özelliği

Bilişim kariyerimdeki yazılım geliştirme ile uğraştığım senelere bakacak olursak, her halde en bıkmış olduğum olduğum konu sessionlardır.

Ne zaman üyelik sistemi veya session ihtiyaç duyduğum bir uygulama üzerinde uğraşsam beni bir huzursuzluk kaplıyor 🙂 Yıllardır bu bende tramva olarak sürer ve en sonunda bununla ilgili birşeyler yazıp içimi dökmek istedim.

Her yazılımcının bildiği gibi HttpContext.Session özelliği kullanımı üç başlık altında özetleyebiliriz. Uygulamaları olarak gideceğimiz için ilk önce string tipindeki değişkenlerimizi oluşturuyoruz.

string _ad = "Hüseyin";
string _soyad = "Yıldırım";
string _sehir = "Manisa";

Sessionlarımıza değişkenlerimizi kayıt ediyoruz.

Session["ad"] = _ad;
Session["soyad"] = _soyad;
Session["sehir"] = _sehir;

Sessionlarımızdaki değeri okuyoruz.

_ad = (string)(Session["ad"]);
_soyad = (string)(Session["soyad"]);
_sehir = (string)(Session["sehir"]);

Web Form sınıfı dışında ise böyle kullanıyoruz.

HttpContext context = HttpContext.Current;
context.Session["ad"] = _ad;
_ad = (string)(context.Session["ad"]);

Teoride her şey ne kadar kolay ama uygulamada hatam nerede yaaa ama bulacağım sorunu 😉

Entity Framework An error occurred while updating the entries. See the inner exception for details.

Ana tablonuzdaki ID ile referans tablonuzda ilişkilendirdiğiniz alanın; değerlerinin birbirinden farklı olmasından kaynaklanan hatadır.

Örnek vermek gerekirse aşağıdaki gibi tablo yapımız var. TBL_KULLANICI tablomuzdaki Id ile TBL_KULLANICI_YETKI tablomuzdaki Kullanici_Id birbiri ile ilişkilidir.

TBL_KULLANICI (Id, Ad)
TBL_KULLANICI_YETKI (Id, Kullanici_Id, Baslik)

Eğer TBL_KULLANICI tablosuna yeni kayıt eklerken aynı anda TBL_KULLANICI_YETKI tablosunada yeni kayıt ile alakı kayıt ekliyorsak; Id ile Kullanici_Id aynı değer olmak zorundadır. Farklı değer olduğunda bu hata ile karşılaşırsınız.

MVC 4 ve Ben

Değişmeyen tek şey değişimdir.

Bir yazılımcı olarak ne kadar değişimlere açığız? Arkadaşlarımızın baskılarıyla ASP’den ASP.NET’e geçtiğinizde, kendi kendinize ne dediğinizi hatırlıyormusunuz? Ben “Allah benim cezamı versin, ASP.NET’e şimdiye kadar neden geçmedim” demiştim.

Geçişlerimizdeki en büyük sorun işe elimizdeki işlerin yoğunluğu ve hiç bir zaman bize yetmeyen zamandır. En azından benim düşüncem, “Ya nasıl olsa, ASP.NET ile yapılanları ASP’lede yapabiliyorum, ne gerek var” dı ama kazın ayağın öyle değilmiş.

ASP’den ASP.NET’e geçiş beni şaşırtmıştı ama ASP.NET’den MVC 4’e geçiş beni büyüledi diyebilirim.

Şunu itiraf etmem gerekir ki yazılım geliştirme süreci biraz uzun gibi olsada, aslında çok eğlenceli. Uygulamayı geliştirken yazılımın esnek olmasıyla uğraşmanıza gerek yok, zaten ister istemez esnek bir hale geliyor.

MVC 4 ile ilk hafta mı bitirdim ve elimdeki ciddi bir projeyide MVC 4 ile yapıyorum. Bu süreç içinde sizlerle paylaşacağım çok güzel bilgiler olacak.

Şimdiden ben bile sabırsızlanıyorum 🙂