2011-06-29 21 views
6

में कस्टम डेटा एनोटेशन सत्यापन बनाना उदाहरण के लिए, मेरे पास एक कर्मचारी दृश्य मॉडल है। कर्मचारी बनाते समय, मैं यह सुनिश्चित करने के लिए उपयोगकर्ता नाम को सत्यापित करना चाहता हूं कि यह अस्तित्व में नहीं है।एमवीसी 3

public class EmployeeViewModel 
{ 
    [ScaffoldColumn(false)] 
    public int EmployeeId { get; set; } 

    [ValidateDuplicate(ErrorMessage = "That username already exists")] 
    [Required(ErrorMessage = "Username is required")] 
    [DisplayName("Username")] 
    public string Username { get; set; } 
} 

और उसके बाद डुप्लिकेट की जांच के लिए कोड के साथ कहीं भी मेरा मान्य डुप्लिकेट फ़ंक्शन है।

क्या यह संभव है?

उत्तर

14

मैं remote validation. पर विचार करने का सुझाव दूंगा उदाहरण यह भी आपके मामले से मेल खाता है।

मूल रूप से, एक नियंत्रक कार्रवाई

[Remote("IsUserExists", "Account", ErrorMessage = "Can't add what already exists!")] 
[Required(ErrorMessage = "Username is required")] 
[DisplayName("Username")] 
public string Username { get; set; } 

जो अपने काम

public ActionResult IsUserExists(string userName) 
{ 
if (!UserService.UserNameExists(userName) || (CurrentUser.UserName == userName)) 
{ 
     return "Ok."; 
} 
} 
+2

यह एक बिंगो है! – Steven

+0

लिंक टूटा हुआ है – sohtimsso1970

+1

डेविड हेडन ने अपने ब्लॉग को कहीं और स्थानांतरित कर दिया और ऐसा प्रतीत होता है कि उन्होंने अपनी पुरानी ब्लॉग पोस्ट (या नहीं कर सका) वापस बंद नहीं किया था। ऐसा कहा जा रहा है, यहां माइक्रोसॉफ्ट के दस्तावेज के लिए सीधे एक लिंक है: http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspx – Khepri

2

हाँ, यह संभव है करता है कि बताते हैं अपने viewmodel संपत्ति के लिए दूरदराज के गुण जोड़ें। आपको write your own validation attribute की आवश्यकता होगी।

+4

लिंक टूटा हुआ है। – NightOwl888

+0

लिंक मेरे लिए काम करता है – sohtimsso1970

0

आप एट्रिब्यूट क्लास को विस्तारित करके इसे मान्य कर सकते हैं जिसे इसे वैध बनाते हैं। मैं इसे इस तरह से करने से बचूंगा क्योंकि यह सिर्फ एक और जगह है जहां आपको संभावित रूप से डेटाबेस में कॉल करना है।

2

here समझाया गया है कि आप अपना स्वयं का कस्टम सत्यापन लिख सकते हैं। मैंने मॉडल में सत्यापन जोड़ने के लिए कोड को संशोधित किया है क्योंकि मैं मॉडल में रेल सक्रिय रिकॉर्ड की सत्यापन शैली पसंद करता हूं।

public class EmployeeViewModel 
{ 

    [CustomValidation(typeof(EmployeeViewModel), "ValidateDuplicate")] 
    [Required(ErrorMessage = "Username is required")] 
    [DisplayName("Username")] 
    public string Username { get; set; } 

    public static ValidationResult ValidateDuplicate(string username) 
    { 
     bool isValid; 

     using(var db = new YourContextName) { 
     if(db.EmployeeViewModel.Where(e => e.Username.Equals(username)).Count() > 0) 
     { 
      isValid = false; 
     } else { 
      isValid = true; 
     } 
     } 

     if (isValid) 
     { 
     return ValidationResult.Success; 
     } 
     else 
     { 
     return new ValidationResult("Username already exists"); 
     } 

    } 
}