2009-09-10 3 views

ответ

41

Docs on MSDN говорит, что вы можете использовать RangeAttribute

[Range(typeof(DateTime), "1/2/2004", "3/4/2004", 
     ErrorMessage = "Value for {0} must be between {1} and {2}")] 
public datetime Something { get; set;} 
+0

спасибо Дэну - Я получаю сообщение об ошибке, хотя и не уверен, как это исправить: «System .ComponentModel.DataAnnotations.RangeAttribute 'не содержит конструктор, который принимает аргументы «0» любая идея? – Davy

+1

Спасибо за вашу помощь. Дэн. Кажется, что это работает, но я не могу подменить строки жестких кодов для чего-то вроде DateTime.Now.Date.toString() Я получаю: Аргумент атрибута должен быть константным выражением, typeof expression или выражение создания массива параметра атрибута типа Sry - я, вероятно, что-то делаю немым :) Davy – Davy

+1

У меня возникли проблемы с тем, чтобы этот метод работал неявно с jquery.validate. У меня создается впечатление, что валидация диапазона на самом деле не переводится на нее? – Dusda

45

Я сделал это, чтобы исправить вашу проблему

public class DateAttribute : RangeAttribute 
    { 
     public DateAttribute() 
     : base(typeof(DateTime), DateTime.Now.AddYears(-20).ToShortDateString(),  DateTime.Now.AddYears(2).ToShortDateString()) { } 
    } 
+1

Просто наткнусь на это, и я поражен тем, насколько простым, но эффективным! Не могу поверить, что так мало голосов. –

+0

Как вы это используете? Например, пожалуйста? – StackThis

+0

Если ваше имя класса является MyDateAttribute, просто поставьте [MyDate] над свойством, которое вы хотите ограничить. – MadHenchbot

9

проверки JQuery не работает с [Range (typeof (DateTime), "date1", "date2"] - Мой MSDN do c неверно

+0

Хотя вы можете заставить его работать, настроив '$ .validator' - [Проверка модели MVC на дату] (https://stackoverflow.com/questions/21777412/mvc-model-validation-for-date/42036626#42036626) –

2

Вот еще одно решение.

[Required(ErrorMessage = "Date Of Birth is Required")] 
[DataType(DataType.Date, ErrorMessage ="Invalid Date Format")] 
[Remote("IsValidDateOfBirth", "Validation", HttpMethod = "POST", ErrorMessage = "Please provide a valid date of birth.")] 
[Display(Name ="Date of Birth")] 
public DateTime DOB{ get; set; } 

Просто создайте новый контроллер MVC под названием ValidationController и пропустите этот код там. Самое приятное в подходе «Remote» - вы можете использовать эту инфраструктуру для обработки любых валидаций на основе вашей пользовательской логики.

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Net.Mail; 
using System.Web; 
using System.Web.Mvc; 

namespace YOURNAMESPACEHERE 
{ 
    public class ValidationController : Controller 
    { 
     [HttpPost] 
     public JsonResult IsValidDateOfBirth(string dob) 
     { 
      var min = DateTime.Now.AddYears(-21); 
      var max = DateTime.Now.AddYears(-110); 
      var msg = string.Format("Please enter a value between {0:MM/dd/yyyy} and {1:MM/dd/yyyy}", max,min); 
      try 
      { 
       var date = DateTime.Parse(dob); 
       if(date > min || date < max) 
        return Json(msg); 
       else 
        return Json(true); 
      } 
      catch (Exception) 
      { 
       return Json(msg); 
      } 
     } 
    } 
} 
4

Для тех редких случаев, когда вы вынуждены писать дату в виде строки (при использовании атрибутов), то я настоятельно рекомендую использовать ISO-8601 обозначения. Это устраняет любую путаницу в отношении того, является ли 01/02/2004 2 января или 1 февраля.

[Range(typeof(DateTime), "2004-12-01", "2004-12-31", 
    ErrorMessage = "Value for {0} must be between {1} and {2}")] 
public datetime Something { get; set;} 
0

Я использую этот подход:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] 
internal sealed class DateRangeAttribute : ValidationAttribute 
{ 
    public DateTime Minimum { get; } 
    public DateTime Maximum { get; } 

    public DateRangeAttribute(string minimum = null, string maximum = null, string format = null) 
    { 
     format = format ?? @"yyyy-MM-dd'T'HH:mm:ss.FFFK"; //iso8601 

     Minimum = minimum == null ? DateTime.MinValue : DateTime.ParseExact(minimum, new[] { format }, CultureInfo.InvariantCulture, DateTimeStyles.None); //0 invariantculture 
     Maximum = maximum == null ? DateTime.MaxValue : DateTime.ParseExact(maximum, new[] { format }, CultureInfo.InvariantCulture, DateTimeStyles.None); //0 invariantculture 

     if (Minimum > Maximum) 
      throw new InvalidOperationException($"Specified max-date '{maximum}' is less than the specified min-date '{minimum}'"); 
    } 
    //0 the sole reason for employing this custom validator instead of the mere rangevalidator is that we wanted to apply invariantculture to the parsing instead of 
    // using currentculture like the range attribute does this is immensely important in order for us to be able to dodge nasty hiccups in production environments 

    public override bool IsValid(object value) 
    { 
     if (value == null) //0 null 
      return true; 

     var s = value as string; 
     if (s != null && string.IsNullOrEmpty(s)) //0 null 
      return true; 

     var min = (IComparable)Minimum; 
     var max = (IComparable)Maximum; 
     return min.CompareTo(value) <= 0 && max.CompareTo(value) >= 0; 
    } 
    //0 null values should be handled with the required attribute 

    public override string FormatErrorMessage(string name) => string.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, Minimum, Maximum); 
} 

И использовать его так:

[DateRange("2004-12-01", "2004-12-2", "yyyy-M-d")] 
ErrorMessage = "Value for {0} must be between {1} and {2}")] 
Смежные вопросы