2017-09-12 1 views
1

나는 사용자가 날짜를 선택할 때 이되도록 검토 모델을 가지고 모델 유효성을 검사하려고하는데 이후의 날짜가 될 수 없습니다.DataAnotation을 사용하여 모델의 유효성을 검사하려면 어떻게 날짜를 확인해야합니까?

Review.cs는

public class Review : BaseEntity{ 

    [Key] 
    public int Id {get; set;} 

    [Required(ErrorMessage="You need a restaurant name!")] 
    public string RestaurantName {get; set;} 

    [What do I put in here??] 
    public DateTime Date {get; set;} 


} 

저는 초보자입니다, 그리고 documentation는 종류의 하드 이해하는 것입니다.

미리 도움을 주셔서 감사합니다.

+0

당신이 인식하지하는 문서를 링크하십시오 :

여기 IValidatableObject를 구현하는 모양에 대한 예제입니다. – Trisped

+0

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation 날짜 시간을 비교하는 방법을 모르겠습니다. – Jung

+0

클라이언트 쪽 유효성 검사를 원하면 [foolproof] (http://foolproof.codeplex.com/) [LessThan]'또는 이와 유사한 속성 또는 직접 구현 - [ASP.NET MVC 3의 전체 유효성 확인 가이드 - 2 부] (https://www.devtrends.co .uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-2) –

답변

3

을 반환합니다. 뷰 모델에서 이제

public class DateLessThanOrEqualToToday : ValidationAttribute 
{ 
    public override string FormatErrorMessage(string name) 
    { 
     return "Date value should not be a future date"; 
    } 

    protected override ValidationResult IsValid(object objValue, 
                ValidationContext validationContext) 
    { 
     var dateValue = objValue as DateTime? ?? new DateTime(); 

     //alter this as needed. I am doing the date comparison if the value is not null 

     if (dateValue.Date > DateTime.Now.Date) 
     { 
      return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
     } 
     return ValidationResult.Success; 
    } 
} 

이 새 사용자 정의와 속성 이름을 장식이 지정 유효성 검사 속성이 primarly 특정 유효성 검사 논리에 초점을 맞추고있다

[DateLessThanOrEqualToToday] 
public DateTime Date { get; set; } 

때문이다. 필요에 따라 더 많은 null 검사, 최소값 검사 등을 포함하도록 변경할 수 있습니다.

+0

자세한 답변을 주셔서 감사합니다. Review.cs 파일에서이 클래스를 작성합니까 ?? – Jung

+0

별도의 클래스를 만들고이를 "CustomValidations"와 같은 폴더에 보관하여 가독성을 높일 수 있습니다. – Shyju

0

이 경우 사용자 지정 검사기를 작성해야합니다. 예를 들어 원하는대로 이름을 지정할 수 있습니다. 자체는이 문서에서 좋은 자세히 설명되어

[DateNotInTheFuture] 
public DateTime Date { get; set; } 

프로세스 : 요약 https://msdn.microsoft.com/en-us/library/cc668224.aspx

:

  • 는 IsValid에 대한 재정의를 구현하는 클래스의 내부 ValidationAttribute
  • 을 상속 새로운 밀봉 된 공용 클래스를 만듭니다 방법.
  • 는 IsValid 방법 내부 사용자 지정 유효성 검사 논리를 작성하고 사용자 정의 로직을 수행하는 사용자 정의 유효성 검사 속성을 만들고 속성 이름을 장식하는 것을 사용할 수있는 결과
0

지정 유효성 검사 또는 속성 표준 모델의 검증을보십시오.

첫 번째 옵션, 재산 표준 dataannotations 검증에 설정 속성 : ErrorMessage가 속성과 dateformatstring와

  • 설정 DateType 속성.
  • 원하는 경우 범위 속성을 설정하십시오.
  • 세트 화면에 표시 라벨에 속성이 표시됩니다.

    [DataType(DataType.Date), ErrorMessage = "Please enter a correct date format dd/mm/yyyy hh:mm", DisplayFormat(DataFormatString="{0:dd/MM/yyyy}", ApplyFormatInEditMode=true)] 
    [Range(typeof(DateTime), "1/1/2016", "1/1/2011")] 
    [Display(Name = "My Date")] 
    public DateTime Date {get; set;} 
    

두 번째 옵션, 사용자 확인 방법는 :

당신은 ValidationAttribute 클래스를 확장하고 IsValid를 오버라이드 (override) 할 필요가 :

public class MyDateValidation: ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     // check your business date property 
     DateTime myDatetime; 
     bool isParsed = DateTime.TryParse((string)value, out myDatetime); 
     if(!isParsed) 
      return false; 
     return true; 
    } 
} 

[MyDateValidation(ErrorMessage="Your message")] 
public Datetime myDate { get; set; } 

내 다른 answer에 대한이 주제를 참조하십시오.

0

대체 방법을 제공하기 위해 Review 클래스에 IValidatableObject을 구현할 수 있습니다. 예를 들어 재사용에 신경 쓰지 않는다면 적절할 수 있습니다. 그렇지 않으면 @ Shyju의 대답이 더 적절할 것입니다.

public class Review : BaseEntity, IValidatableObject 
{ 
    ... 

    public DateTime Date { get; set; } 

    IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (Date > DateTime.Now) 
      yield return new ValidationResult("Your error message."); 
    }  
} 
관련 문제