ASP.Net MVC Remote Validation

02 Ocak 2016 2 dk okuma süresi 111 okunma

Remote validation, yani uzaktan doğrulama MVC 3 ile gelen kullanışlı bir özellik. Kullanım amacı ilgili parametrenin veritanında var olup olmadığını kullanıcıya kolayca göstermek. Şöyleki; bir kullanıcı kayıt sayfanız var ve kullanıcı adı herkese özel yani unique. Remote attribute'u sayesinde kullanıcı inputu girdiğinde kontrol işlemi başlıyor ve veritabanında aynı kullanıcı adının olup olmadığını kontrol edip geriye bir mesaj dönüyor.

Bu özelliği kullanabilmek için jQuery ve jQuery validation kütüphanelerinin sayfaya eklenmiş olması gerekir. Aynı zamanda web.config üzerinde appSetting'te aşağıdaki gibi olmalıdır ve ilgili entity'nin de System.ComponentModel.DataAnnotations (Remote attribute'u için) namespace'ini kullanıyor olması gerekiyor.

// Bundle olarak eklemek isterseniz
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval")
<span class="redactor-invisible-space">
// sadece script dosyalarini kullanmak isterseniz</span>
<script src="~/Scripts/jquery-1.11.1.min.js" type="text/javascript"></script>
<script src="~/Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>

<!-- web.config -->
<appSettings>
 <add key="ClientValidationEnabled" value="true"/>
 <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>


Remote attribute'unun kullanımı aşağıdaki gibidir. Bir kullanıcı kayıt formunuz olduğunu varsayın.

public class Kullanici
{
    [Required]
    [Remote("Kontrol", "Kullanici", ErrorMessage = "Bu kullanici adi baskasina ait.")]
    // "Kontrol" action methodu, "Kullanici" controller'ımızın adı, "ErrorMessage" eğer kullanıcı varsa gösterilecek hata mesajı (bunu controller tarafından da gönderebilirsiniz.)    
    public string KullaniciAdi { get; set; }
    
    [Required]
    [DataType(DataType.Password)]
    public string Sifre { get; set; }
}
@model Models.Kullanici 

@{
    ViewBag.Title = "Kayıt Formu";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Yeni Kullanici Kaydı</h2>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)

    @Html.TextBoxFor(x => x.KullaniciAdi)
<span class="redactor-invisible-space">    @Html.ValidationMessageFor(x => x.KullaniciAdi)
</span>
    @Html.TextBoxFor(x => x.Sifre)
<span class="redactor-invisible-space">    @Html.ValidationMessageFor(x => x.Sifre)
</span>
    <button type="submit" class="btn btn-primary">Gönder</button>
}
public ActionResult Kontrol(string kullanici_adi)
{
    var count = db.Kullanicilar
        .Count(x => x.KullaniciAdi.Equals(kullanici_adi));
 
    if (count == 0)
       return Json(true, JsonRequestBehavior.AllowGet);
    else
       return Json(false, JsonRequestBehavior.AllowGet);
}

Eğer action'dan false değeri gelirse form üzerinde uyarı/hata mesajı çıkar ve submit butonu çalışmaz.

Yazılarıma abone olmak ister misiniz?
Spam yapılmaz, sadece bildirim amaçlıdır. İstediğiniz zaman abonelikten çıkabilirsiniz.
İlginizi çekebilecek diğer yazılar.
VS2015'in 3. update'ini yaptıktan sonra asp.net core web uygulaması yaratmak istediğimde şu şekilde bir hata ile karşılaştım. "Exception : The system cannot find the file specified. (Exception from HRESULT: 0x80070002)". Çözümü oldukça basit.

Entity framework code first kullanıyorsanız ve inheritance yapıp yeni bir class yarattığınızda bunun gibi bir hata alırsınız. Bunun nedeni fluent api'nin inheritance yapılan class ile ana class'ın map yapmaya çalışması ve ilgili kolonu veritabanında bulamamasıdır. Çözümü ise inherit olmuş class'a [NotMapped] DataAnnotations attribute'unu eklemek.

jQuery ile tüm tarayıcılarda input select option'larını sağlıklı şekilde gizleyip göstermeye yarayan kod parçası.