어떤 MVC 검증 프레임 워크
-
05-07-2019 - |
문제
ASP.NET MVC 프레임 워크에서 엔티티를 검증하기위한 프레임 워크로 XVal을 평가했습니다. 나는 최근에 검증 규칙이 깨질 때마다 xval이 발굴을 일으킨다는 것을 발견했습니다. 나에게 틀린 것 같다. 예를 들어, 사용자가 양식을 채우고 3 개의 필수 필드를 채우는 것을 잊어 버리면 세 가지 예외가 발생됩니다. 이것이 좋은 연습입니까? ( 편집하다: 나는 또한 이것을 읽었습니다. 그래서 나는 그것이 좋은 연습이 아니라고 생각합니다)
XVal 사용 경험은 무엇입니까? 예외를 던지지 않는 대체 검증 프레임 워크가 있습니까?
감사
(PS : 많은 사람들이 이것을 읽고 있다는 것을 알았습니다. 유창한 검증을 사용하고 있습니다 지금)
해결책
다른 팁
아니오는 심각하게 잘못되지 않았기 때문에 간단한 메시지 대신 예외를 보여주는 것이 좋지 않습니다 ... 대신 채워야합니다. ModelState
이러한 오류로 사용하여 양식에 표시합니다.
Html.ValidationMessage("EntityPropertyName");
XVal은이 모든 것을 지원합니다. 양식이 다시 게시되기 전에 클라이언트 측에서 검증 할뿐만 아니라.
일부 코드
설정할 때 DataAnnotations
엔티티 클래스 (또는 메타 데이터 동반자 클래스)에 대한 속성이 가장 유사한 () 메소드를 구현할 가능성이 높습니다. 가장 좋은 방법은 자동 생성되는 T4를 사용하는 것입니다. 따라서 동일한 코드를 반복해서 반복 할 필요가 없습니다 ...
public IEnumerable<ErrorInfo> Validate()
{
IList<ErrorInfo> errors = DataAnnotationsValidationRunner.GetErrors(this).ToList<ErrorInfo>();
return errors.AsEnumerable();
}
그런 다음해야 할 일은 다음과 같습니다.
IEnumerable<ErrorInfo> errors = entityObjectInstance.Validate();
if (errors.Any())
{
new RulesException(errors).AddModelStateErrors(filterContext.Controller.ViewData.ModelState, entityPropertyName);
}
이를 더욱 자동화하기 위해 액션 필터에서이를 구현할 수 있으므로 컨트롤러 작업으로 전달되는 엔티티 객체에 대한 유효성 검사가 자동으로 이루어집니다. 컨트롤러 동작은 단지 여부 만 확인하면됩니다 ModelState.IsValid()
그 다음에.
여기에서 필요한 수업은 더 필요합니다 (웹에서 가져온 것) :
public static class DataAnnotationsValidationRunner
{
public static IEnumerable<ErrorInfo> GetErrors(object instance)
{
var metadataAttribute = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
var metaClass = metadataAttribute != null ? metadataAttribute.MetadataClassType : instance.GetType();
var metaClassProperties = TypeDescriptor.GetProperties(metaClass).Cast<PropertyDescriptor>();
var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();
return from metaProp in metaClassProperties
join modelProp in modelClassProperties on metaProp.Name equals modelProp.Name
from attribute in metaProp.Attributes.OfType<ValidationAttribute>()
where !attribute.IsValid(modelProp.GetValue(instance))
select new ErrorInfo(metaProp.Name, attribute.FormatErrorMessage(string.Empty), instance);
}
}
MVC 2
ASP.NET MVC 2 베타 2의 유효성 검사는 XVAL과 유사합니다. 따라서 프로젝트에 너무 멀지 않고 사용을 고려할 수 있다면 개발 진행 상황에서 코드 당신의 기초로서, 아마도 그것은 당신을 위해가는 길 일 것입니다.