2012-06-04 19 views
19
में आज की तारीख सत्यापन एनोटेशन करने के लिए समान

किसी को भी एक भी चुनी गई तिथि के बराबर या आज की तारीख से अधिक होना आवश्यक है कि दिनांक सत्यापन के लिए एक MVC3 डेटा एनोटेशन देखा है?से अधिक या MVC3

यदि पहले से ही कोई तीसरी पार्टी उस ठंड पर भी जोड़ती है। मैं पहले ही DataAnnotationsExtensions का उपयोग कर रहा हूं लेकिन यह वह ऑफर नहीं करता है जिसे मैं ढूंढ रहा हूं।

इस पर कोई संदर्भ नहीं प्रतीत होता है। इसलिए, उम्मीद है कि पहिया को फिर से शुरू करने और अपना खुद का कस्टम सत्यापनकर्ता लिखने से पहले किसी ने इसे हल कर लिया है।

मैंने Range की कोशिश की है लेकिन इसके लिए 2 तिथियों की आवश्यकता है और दोनों को [Range(typeof(DateTime), "1/1/2011", "1/1/2016")] जैसे स्ट्रिंग प्रारूप में स्थिरांक होना चाहिए, लेकिन इससे मदद नहीं मिलती है। और DataAnnotationsExtensions Min सत्यापनकर्ता केवल int और double


अद्यतन स्वीकार करता हल

धन्यवाद @BuildStarted को यह क्या मैं के साथ समाप्त हो गया है और यह मेरी स्क्रिप्ट के साथ महान सर्वर साइड और अब ग्राहक के पक्ष में काम करता है


using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

namespace Web.Models.Validation { 

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
    public sealed class DateMustBeEqualOrGreaterThanCurrentDateValidation : ValidationAttribute, IClientValidatable { 

     private const string DefaultErrorMessage = "Date selected {0} must be on or after today"; 

     public DateMustBeEqualOrGreaterThanCurrentDateValidation() 
      : base(DefaultErrorMessage) { 
     } 

     public override string FormatErrorMessage(string name) { 
      return string.Format(DefaultErrorMessage, name); 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) { 
      var dateEntered = (DateTime)value; 
      if (dateEntered < DateTime.Today) { 
       var message = FormatErrorMessage(dateEntered.ToShortDateString()); 
       return new ValidationResult(message); 
      } 
      return null; 
     } 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { 
      var rule = new ModelClientCustomDateValidationRule(FormatErrorMessage(metadata.DisplayName)); 
      yield return rule; 
     } 
    } 

    public sealed class ModelClientCustomDateValidationRule : ModelClientValidationRule { 

     public ModelClientCustomDateValidationRule(string errorMessage) { 
      ErrorMessage = errorMessage; 
      ValidationType = "datemustbeequalorgreaterthancurrentdate"; 
     } 
    } 
} 

और मेरे मोड में एल

[Required] 
[DateMustBeEqualOrGreaterThanCurrentDate] 
public DateTime SomeDate { get; set; } 

क्लाइंट साइड स्क्रिप्ट

/// <reference path="jquery-1.7.2.js" /> 

jQuery.validator.addMethod("datemustbeequalorgreaterthancurrentdate", function (value, element, param) { 
    var someDate = $("#SomeDate").val(); 
    var today; 
    var currentDate = new Date(); 
    var year = currentDate.getYear(); 
    var month = currentDate.getMonth() + 1; // added +1 because javascript counts month from 0 
    var day = currentDate.getDate(); 
    var hours = currentDate.getHours(); 
    var minutes = currentDate.getMinutes(); 
    var seconds = currentDate.getSeconds(); 

    today = month + '/' + day + '/' + year + ' ' + hours + '.' + minutes + '.' + seconds; 

    if (someDate < today) { 
     return false; 
    } 
    return true; 
}); 

jQuery.validator.unobtrusive.adapters.addBool("datemustbeequalorgreaterthancurrentdate"); 
+0

सर्वर DateTime.Today और क्लाइंट साइड datetime में नीचे पंक्ति जोड़ें। मुझे लगता है कि आपको जावास्क्रिप्ट नई तिथि() का उपयोग करने के बजाय सर्वर साइड टाइम पास करना चाहिए। –

+0

एक और मुद्दा यह है कि आप मानते हैं कि ग्राहक की अमेरिकी तिथि सेटिंग्स (मिमी/डीडी/yyyy) (आज = महीना + '/' + दिन + '/' + वर्ष + '' + घंटे + '।' + मिनट + ' । + सेकंड;) यह अन्य लोकेशंस में काम नहीं करेगा। –

+0

अच्छी कॉल, लेकिन हम यूएस –

उत्तर

16

कस्टम विशेषता बनाएँ।

public class CheckDateRangeAttribute: ValidationAttribute { 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) { 
     DateTime dt = (DateTime)value; 
     if (dt >= DateTime.UtcNow) { 
      return ValidationResult.Success; 
     } 

     return new ValidationResult(ErrorMessage ?? "Make sure your date is >= than today"); 
    } 

} 

कोड कफ बट्टे खाते में डाल दिया गया था ताकि किसी भी त्रुटि :)

+0

मैं भूल गया, मेरे सिर के ऊपर से, कैसे बनाना है जावास्क्रिप्ट संस्करण। यदि आप रुचि रखते हैं तो मुझे इसके लिए कुछ पुराना कोड देखना होगा। – Buildstarted

+0

मेरे पास एक ग्राहक पक्ष है जिसे मैं अनुकूलित कर सकता हूं :-) धन्यवाद! –

+2

संशोधित एक्सेस "सार्वजनिक" के बजाय "संरक्षित" होना चाहिए - अन्यथा यह काम करता है। – jakejgordon

8

उपयोग [Remote] विशेष सत्यापन, सरल और आसान के लिए तय:

आपका मॉडल:

[Remote("ValidateDateEqualOrGreater", HttpMethod="Post", 
    ErrorMessage = "Date isn't equal or greater than current date.")] 
public DateTime Date { get; set; } 
//other properties 

आपकी कार्रवाई:

[HttpPost] 
public ActionResult ValidateDateEqualOrGreater(DateTime Date) 
{ 
    // validate your date here and return True if validated 
    if(Date >= DateTime.Now) 
    { 
     return Json(true); 
    } 
    return Json(false);  
} 
+0

मैंने माना कि वह दिशा नहीं है जिसे मैं जाना चाहता हूं, मुझे इसके लिए क्लाइंट साइड jquery भी बनाना होगा। अच्छा सुझाव था! –

+0

कोई क्लाइंट साइड jquery की आवश्यकता नहीं है। –

+0

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

-3

इस कार्य को पूरा करने का सरल तरीका CompareValidator का उपयोग कर रहा है।

नीचे दिया गया कोड AjaxControlToolKit के CalendarExtender का उपयोग करता है। अपने HTML निर्देश के लिए नीचे दिए गए कोड को कॉपी

<asp:TextBox ID="txtCompletionDate" runat="server" CssClass="txtNormal"></asp:TextBox> 
         <cc1:CalendarExtender ID="CalendarExtender1" TargetControlID="txtCompletionDate" 
          Format="dd/MM/yyyy" runat="server"> 
         </cc1:CalendarExtender> 
         <asp:RequiredFieldValidator ID="rfvCompletionDate" runat="server" ControlToValidate="txtCompletionDate" 
          CssClass="labelError" ErrorMessage="*"></asp:RequiredFieldValidator> 
         <asp:CompareValidator ID="cvDate" runat="server" ControlToCompare="hiddenbox" ErrorMessage="*" 
          ControlToValidate="txtCompletionDate" CssClass="labelError" ToolTip="Completion Date should be greater than or equal to Today" 
          Operator="GreaterThanEqual" Type="Date"></asp:CompareValidator>       
         <asp:TextBox ID="hiddenbox" runat="server" CssClass="hiddenbox"> 
</asp:TextBox> 

अलग किया जा सकता है सीएसएस

.hiddenbox {display:none;} 
+2

यह एमवीसी है जो रेजर वेबफॉर्म नहीं है, सर्वर साइड कंट्रोल का उपयोग नहीं किया जाता है। –