2013-11-09 8 views
26

तुलना मैं अपने मॉडल में इन दो क्षेत्रों है:mvc4 डेटा एनोटेशन दो तिथियों

[Required(ErrorMessage="The start date is required")] 
[Display(Name="Start Date")] 
[DisplayFormat(DataFormatString = "{0,d}")] 
public DateTime startDate { get; set; } 

[Required(ErrorMessage="The end date is required")] 
[Display(Name="End Date")] 
[DisplayFormat(DataFormatString = "{0,d}")] 
public DateTime endDate{ get; set; } 

मैं अपेक्षा करते हैं कि endDatestartDate से अधिक होना चाहिए। मैंने [Compare("startDate")] का उपयोग करने की कोशिश की लेकिन यह केवल बराबर ऑपरेशन के लिए काम करता है।

"ऑपरेशन" से अधिक के लिए मुझे क्या उपयोग करना चाहिए?

उत्तर

53

Fluent Validation या MVC Foolproof Validation पर एक नज़र डालें: वे आपकी बहुत मदद कर सकते हैं।

फ़ूलप्रूफ के साथ उदाहरण के लिए [GreaterThan("StartDate")] एनोटेशन है जो आप अपनी तिथि संपत्ति पर उपयोग कर सकते हैं।

या आप अन्य पुस्तकालयों का उपयोग नहीं करना चाहते हैं, तो आप अपने मॉडल पर IValidatableObject को लागू करने से अपने स्वयं के कस्टम मान्यता को लागू कर सकते हैं:

public class ViewModel: IValidatableObject 
{ 
    [Required] 
    public DateTime StartDate { get; set; } 
    [Required]  
    public DateTime EndDate { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (EndDate < StartDate) 
     { 
      yield return 
      new ValidationResult(errorMessage: "EndDate must be greater than StartDate", 
            memberNames: new[] { "EndDate" }); 
     } 
    } 
} 
+0

यह क्लाइंट साइड (जेएस) पर काम नहीं करेगा, है ना? आपको यह संदेश केवल सबमिट पर मिलेगा? – Davor

+0

@Davor यह क्लाइंट साइड पर भी काम करेगा। –

+2

रिटर्न प्रकार के रूप में IENumerable है, "उपज वापसी नया सत्यापन Result ..." एक बेहतर परिणाम मिलेगा। :) –

9

IValidatableObject इंटरफेस के लिए एक वस्तु मान्य करने की एक तरीका प्रदान करता है जो औजार IValidatableObject.Validate (प्रमाणीकरण कॉन्टेक्स्ट सत्यापन कॉन्टेक्स्ट) विधि। यह विधि हमेशा IENumerable ऑब्जेक्ट लौटाती है। यही कारण है कि आपको ValidationResult ऑब्जेक्ट्स की सूची बनाना चाहिए और त्रुटियों को इसमें जोड़ा गया है और वापस आना है। खाली सूची का अर्थ आपकी स्थितियों को सत्यापित करना है। एमवीसी 4 में निम्नानुसार है ...

public class LibProject : IValidatableObject 
{ 
    [Required(ErrorMessage="Project name required")] 

    public string Project_name { get; set; } 
    [Required(ErrorMessage = "Job no required")] 
    public string Job_no { get; set; } 
    public string Client { get; set; } 
    [DataType(DataType.Date,ErrorMessage="Invalid Date")] 
    public DateTime ExpireDate { get; set; } 


    IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext) 
    { 
     List <ValidationResult> res =new List<ValidationResult>(); 
     if (ExpireDate < DateTime.Today) 
     { 
      ValidationResult mss=new ValidationResult("Expire date must be greater than or equal to Today"); 
      res.Add(mss); 

     } 
     return res; 
    } 
} 
+1

यह समाधान चयनित उत्तर से बेहतर है क्योंकि आपके पास तुलना करने के लिए एक से अधिक मामले होने पर सत्यापन परिणामों की सूची की आवश्यकता होगी। धन्यवाद। –

संबंधित मुद्दे