2016-03-21 18 views
3

MVC'de bir modelim ve bir actionMethod var; Create() eylem günüASP.NET MVC Uzaktan Doğrulama mantığı Düzenle on

public class employee 
{ 
    [Key] 
    public int id { get; set; } 

    [Required] 
    public string employeeID { get; set; } 

    [Required] 
    [Remote("doesCnicExist", "employee", AdditionalFields = "employeeID", HttpMethod = "POST", ErrorMessage = "A user with this cnic already exists. Please enter a different cnic.")] 
    public string cnic { get; set; } 
} 

[HttpPost] 
    public JsonResult doesCnicExist(string employeeID, string cnic) 
    { 
     var empList = hc.employee.ToList(); 
     bool flag = false; 
     foreach (employee e in empList) 
     { 
      if ((employeeID == e.employeeID) && (cnic == e.cnic)) 
      { 
       flag = true; 
      } 
     } 
     return Json(flag == false); 
    } 

, harika çalışıyor. Ancak, Edit() eyleminde, program zaten var cnic görür. Ve employee'u aynı cnic ile güncelleyemiyorum. Düzenleme sırasında çalışan nesnesinin benzersizliğini elde etmek için ek employeeID alanını nasıl kullanabileceğimi anlayamıyorum? id yana

+0

"int id" ile "string employeeID" arasındaki fark nedir? Ve denediniz 'doCnicExist()' yöntemini göstermeniz gerekir. –

+0

@StephenMuecke 'int id', tablo için veritabanı tarafından otomatikleştirilir ve 'Çalışan Kimliği' kuruluş tarafından atanır. Üzgünüm, bu durum için olası bir mantık hakkında tamamen düşünemedim - 'doCnicExist()' için. Bu yüzden bu soruyu sordum. – Jogi

+0

Ama 'Create() 'eyleminiz için çalıştığını söylediniz. Öyleyse göster ve daha sonra 'Edit()' yöntemi için çalışmak düzeltilebilir. (Bu id 've' çalışanID 'alanları kadar gitmek, 2 tanımlayıcı alanlara sahip noktası nedir? - Bu anahtarın bu yana" Eklentiler "de' id 'alanını kullanmalısınız) –

cevap

1

benzersiz tanımlayıcı, sen doesCnicExist() yönteme o geçmesi gerekiyor ve sonra id zaten var satırları çıkmadan görmezden mantığı değiştirebilirsiniz. RemoteAttribute sadece istemci tarafında doğrulama ve onaylama her zaman sunucu üzerinde yapılmalıdır, çünkü

public class employee 
{ 
    [Key] 
    public int id { get; set; } 
    .... 
    [Required] 
    [Remote("doesCnicExist", "employee", AdditionalFields = "id", HttpMethod = "POST", ErrorMessage = "A user with this cnic already exists. Please enter a different cnic.")] 
    public string cnic { get; set; } 
} 

modeli ve ayrı bir yönteme mantık ayrıldıktan

[HttpPost] 
public JsonResult doesCnicExist(string cnic, int id) 
{ 
    return Json(IsUnique(cnic, id)); 
} 

private bool IsUnique(string cnic, int id) 
{ 
    if (id == 0) // its a new object 
    { 
    return !hc.employee.Any(x => x.cnic == cnic); 
    } 
    else // its an existing object so exclude existing objects with the id 
    { 
    return !hc.employee.Any(x => x.cnic == cnic && x.id != id); 
    } 
} 

Not kontrol yöntemini değiştirme (müşteri tarafında doğrulama güzel bir bonus olarak kabul edilmelidir, ancak kötü niyetli bir kullanıcı kolayca atlayabilir). Ayrı yöntem, veritabanına kaydedildiğinde olası bir özel durumun engellenmesini önlemek için Create() ve Edit() POST yöntemlerinde de doğrulamanıza olanak tanır.

Ama RemoteAttribute bir istemci tarafı olduğu için (UI) özellik, yine bir veri modeline uygulanmamalıdır ve iyi uygulamalara ve özellik görünümünüzü modeli özelliğine uygulanır view model değil kullanarak olmalıdır veri modeli. Ayrıca, sınıflarınız ve özellik adlarınız için normal adlandırma kuralları kullanmanızı öneririz (ör. PascalCase).

+0

Yan not: Nasıl çalıştığına dair bir örnek için [bu DotNetFiddle] 'a bakın (https://dotnetfiddle.net/jVHK7p) –

+0

Önerilen çözümünüzden sonra, üzgünüm ama '[HttpPost] Create()' ateş etmiyor. 'Create' düğmesine bastığımda, program sadece orada sıkışır. – Jogi

+0

Ne demek istiyorsun - kodumdaki hiçbir şey 'Create()' yöntemiyle ilgisi yok - hatta bu soruda bile göstermedin –

İlgili konular