데이터 주석을 사용한 사용자 정의 유효성 검사

asp.net-mvc data-annotations entity-framework

문제

입력 된 데이터를 확인하기 위해 데이터 주석을 사용하고 있지만 데이터를 확인하는 더 많은 맞춤형 방법에 관해서는 막혀 있습니다.

데이터베이스에 대해 쿼리를 실행하여 항목이 있는지 여부를 확인한 다음 "회사 이름이 이미 있습니다"와 같이 "사용자 정의 db-check 오류"가 표시되면 사용자에게 다시보고해야합니다.

데이터 노트와 함께 어떻게 구현할 수 있습니까?

나는 3.5q1와 함께 제공되는 linq와 엔티티 프레임 워크를 사용하여 모든 쿼리를 수행했다.

/엠

수락 된 답변

데이터 주석을 확장하는 맞춤 속성

데이터 저장소에 대한 개체 인스턴스의 유효성 검사를 수행 할 자체 특성을 작성해야합니다.

클래스가 System.ComponentModel.DataAnnotations.ValidationAttribute 클래스를 상속하는지 확인하십시오.

public class MustNotExist: ValidationAttribute
{
    ...
}

주의

개체가 데이터 저장소 내에서 고유하다는 것을 확인해야 할 때 비슷한 상황이 발생했습니다. 그러나 이러한 종류의 유효성 검증은 엔티티 클래스 자체에서는 불가능합니다. 왜냐하면 생성되는 엔티티에서만 작동해야하며 데이터 스토어에서 엔티티를 이미 반환 할 때는 유효하지 않기 때문입니다.

내 솔루션은 별도의 인터페이스, 클래스 및 특성이 있어야했습니다.

public interface IExternalValidator ...

class DBUniqueValidator: IExternalValidator ...

class ValidateExternallyAttribute: FilterAttribute, IActionFilter
{
    ...
    public ValidateExternallyAttribute(Type validatorType, Type entityType) ...
    ...
}

엔터티 매개 변수를 가져 오는 컨트롤러 동작에 내 특성을 배치 할 수있었습니다. 그런 다음 필터 동작 특성은 컨트롤러 동작 매개 변수 (해당 형식과 값에 쉽게 액세스 할 수 있음)를 확인하고 올바른 매개 변수 (특성 정의에 제공된 형식)에 대해 외부 유효성 검사기를 실행하고 유효성 검사가 실패 할 때 ModelState 오류를 채 웁니다.

[ValidateExternally(typeof(DBUniqueValidator), typeof(User))]
public ActionResult RegisterUser(User newUser)
{
    if (!this.ModelState.IsValid)
    {
        // act accordingly - probably return some error depending on model state errors
    }
    // register new user in data store
}

이렇게하면 실제로 필요한 액션에 대해서만 외부 유효성 검사를 실행할 수 있었고이 기술은 컨트롤러 액션 코드가 깨끗하고 짧게 유지되도록 도왔습니다. 모델 상태 오류가 있는지 확인하기 만하면됩니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.