2014-02-14 205 views
15

是否有任何MVC 5的默認驗證,我可以設置日期的最小值和最大值?MVC模型驗證日期

在我的模型,我想日期驗證

public class MyClass 
    {    
     [Required(ErrorMessage="Start date and time cannot be empty")] 
     //validate:Must be greater than current date 
     [DataType(DataType.DateTime)] 
     public DateTime StartDateTime { get; set; } 

     [Required(ErrorMessage="End date and time cannot be empty")] 
     //validate:must be greater than StartDate 
     [DataType(DataType.DateTime)] 
     public DateTime EndDateTime { get; set; }    
    } 

PS:根據這個Asp.Net Website,存在使用Range驗證的日期時間的問題,並且不建議。

注:jQuery驗證不與Range屬性和 DateTime的工作。例如,下面的代碼將始終顯示 客戶端驗證錯誤,即使在日期是 指定範圍:

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]

你需要禁用jQuery的日期驗證使用range屬性約會時間。在您的模型中編譯日期很難,因此不鼓勵使用Range屬性和日期時間 。

我也知道,還有的NuGet包,比如Fluent ValidationFoolproof該做的伎倆用於驗證和檢查,如果一個日期比另一種更大的,但我想知道,如果在默認情況下有東西,檢查日期的最小值和最大值。

從我在Whats new in MVC 5.1看到的,有支持MaxLengthMinLength驗證。

+0

你可以做一個[自定義驗證](http://stackoverflow.com/questions/27182606/asp-mvc-5-client-validation-for-range-of- datetimes?noredirect = 1&lq = 1) – Shadetheartist

+0

http://stackoverflow.com/questions/40543473/range-limt-for-datetime-and-date-field-in-mvc/40544222#40544222看到這個答案 –

回答

-3

我覺得只是添加屬性「範圍」將工作

[Range(typeof(DateTime), "01/01/1900", "06/06/2079", ErrorMessageResourceType = typeof(Resources.Patient), ErrorMessageResourceName = "DateOfBirth_Range")] 
+7

如果你看着這個網站asp.net/mvc/ tutorials/mvc-5/introduction/adding-validation它說'「注意:jQuery驗證不適用於Range屬性和DateTime。例如,即使日期在指定範圍內,以下代碼也會始終顯示客戶端驗證錯誤:[Range(typeof(DateTime),「1/1/1966」,「1/1/2020」)]您需要禁用jQuery日期驗證才能在DateTime中使用Range屬性。在模型中編譯硬日期通常不是一個好習慣,所以不要使用Range屬性和DateTime。「' – Cybercop

3

我從System.ComponentModel.DataAnnotations的IValidatableObject接口,它允許你添加額外的驗證規則,你可以這樣做呢更多的檢查。將接口添加到您的課程中,然後實施Validate方法,您可以在其中比較StartDateTime和當前日期/時間,並將EndDateTime與StartDateTime進行比較,例如,

public class MyClass : IValidatableObject 
{    
    [Required(ErrorMessage="Start date and time cannot be empty")] 
    //validate:Must be greater than current date 
    [DataType(DataType.DateTime)] 
    public DateTime StartDateTime { get; set; } 

    [Required(ErrorMessage="End date and time cannot be empty")] 
    //validate:must be greater than StartDate 
    [DataType(DataType.DateTime)] 
    public DateTime EndDateTime { get; set; }  

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     List<ValidationResult> results = new List<ValidationResult>(); 

     if (StartDateTime < DateTime.Now) 
     { 
      results.Add(new ValidationResult("Start date and time must be greater than current time", new []{"StartDateTime"})); 
     } 

     if (EndDateTime <= StartDateTime) 
     { 
      results.Add(new ValidationResult("EndDateTime must be greater that StartDateTime", new [] {"EndDateTime"})); 
     } 

     return results; 
    }  
} 

唯一潛在的缺點這是Validate運行服務器端,而不是在jQuery驗證。

0

正常情況下,我想在服務器中驗證某些內容時使用此解決方案。 我知道你可以依賴MVC使用的驗證模型,但是當我進行驗證時,我試圖使用一個單獨的項目,以便我需要爲它們進行單元測試。假設您有兩個應用程序,一個Desktop和一個Web,那麼兩個應用程序可以共享ValidationProject,而不是在兩個應用程序中重複同一個「View」/「Screen」的代碼。這裏的想法是將驗證項目隔離爲解決方案的獨立項目。

所以,你可以從的NuGet下載FluentValidation項目,FluentValidation使用構造內部規則,你可以在這裏看到的文檔https://github.com/JeremySkinner/FluentValidation/wiki

你的約會規則可用於ONT這種方式,例如,在那裏,你可以把規則的最小值和你的最大值也:

public class CustomerValidator: AbstractValidator<Customer> { 
    public CustomerValidator() { 
        RuleFor(customer => customer.startDate) 
        .NotNull() 
        .WithMessage("You should select a start date") 
        .Must(d => d.HasValue && d.Value <= DateTime.Today) 
        .WithMessage("The start date should not be greather than current month/year"); 
    } 

現在你的控制器內

[HttpPost] 
public ActionResult Index(Customer c) 
{ 
    if(ModelState.IsValid) 
    { 
    var validator= new CustomerValidator(); 
    var valResult = validator.Validate(c); 

    if (valResult.Errors.Count != 0) 
    { 
     valResult.Errors.ForEach(x => ModelState.AddModelError(x.PropertyName, x.ErrorMessage)); 
     return View(vm); 
    } 

    //Your code here 
    } 
} 
2

沒有東東d禁用jQuery日期驗證(這可能會導致其他問題)。您只需要覆蓋$.validatorrange方法。

默認情況下,它的數值作品(然後回落到一個字符串比較),所以你可以jquery.validate.jsjquery.validate.unobtrusive.js後添加以下腳本(而不是包裹在$(document).ready

$.validator.methods.range = function(value, element, param) { 
    if ($(element).attr('data-val-date')) { 
     var min = $(element).attr('data-val-range-min'); 
     var max = $(element).attr('data-val-range-max'); 
     var date = new Date(value).getTime(); 
     var minDate = new Date(min).getTime(); 
     var maxDate = new Date(max).getTime(); 
     return this.optional(element) || (date >= minDate && date <= maxDate); 
    } 
    // use the default method 
    return this.optional(element) || (value >= param[ 0 ] && value <= param[ 1 ]); 
}; 

然後你可以在您的財產使用RangeAttribute

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")] 
public DateTime Date { get; set; } 
+0

這應該被標記爲接受的答案。謝謝Stephen! – ClownCoder