내 MVC 모델 중 하나에 대해 사용자 정의 TypeDescriptionProvider를 만들었습니다. ValidationAttribute를 동적으로 할당하는 데 사용합니다.MVC 유효성 검사 기능이있는 CustomTypeDescriptor - property.GetValue (구성 요소)를 사용하여 속성 값을 얻는 방법?
하나의 속성 값을 사용하여 다른 속성에 추가 할 속성을 결정합니다. DataAnnotationsValidationRunner를 사용하는 웹 서비스에서 유효성 검사가 올바르게 작동합니다. 주자의
출처 : here
internal static class DataAnnotationsValidationRunner
{
public static IEnumerable<ErrorInfo> GetErrors(object instance)
{
return from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>()
from attribute in prop.Attributes.OfType<ValidationAttribute>()
where !attribute.IsValid(prop.GetValue(instance))
select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), instance);
}
}
이 MVC보기에서이 설명과 함께이 모델을 사용하는 경우 내가 (MyCustomTypeDescriptor에서) 코드
public override PropertyDescriptorCollection GetProperties()
{
var originalProperties = base.GetProperties();
var newProperties = new List<PropertyDescriptor>();
var myProperty = originalProperties.Find("CountryCodeID", false)
var myId = (int)countryProperty.GetValue(base.GetPropertyOwner(myProperty));
foreach (PropertyDescriptor pd in originalProperties)
{
AttributeCollection runtimeAttributes = pd.Attributes;
// add new attributes based on myId value
....
}
return new PropertyDescriptorCollection(newProperties.ToArray());
}
를 다음을 사용 속성 값을 얻으려면, 나는 다음과 같은 예외가 :
값은 null 일 수 없습니다. 매개 변수 이름 : 기본 설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 시작된 위치에 대한 자세한 내용은 스택 추적을 검토하십시오.
예외 정보 : System.ArgumentNullException : 값은 null 일 수 없습니다. 매개 변수 이름 : 기본
TypeDescriptor 내에서 값의 올바른 값을 가져 오는 올바른 방법은 무엇입니까? 이 설명자는 인스턴스가 아닌 모델 유형의 공급자를 통해 사용됩니다 (예 : global.asax).
편집 : 해결 방법을 찾았습니다. MyTypeDescriptorProvider의 GetTypeDescriptor 메소드에서 인스턴스 매개 변수를 사용하여 MyCustomTypeDescriptor의 consctructor로 전달합니다. 그러나 MVC 유효성 검사는 작동하지 않습니다. 나는 자동으로 이러한 동적 데이터를 사용하지만 (위에서 언급 한 러너와 비슷 함).
편집 2 : workaroud를 사용하면 거의 항상 인스턴스 null이 표시됩니다. 그래서 거기에 가치를 부여하고 TypeDescriptor의 consctructor에 넣는 것은 불가능합니다 ...
고마워요!
이 기능에 대한 요청을 제출했습니다. http : //aspnetwebstack.codeplex.com/SourceControl/network/forks/Flowster/aspnetwebstack/contribution/8164를 참조하십시오. – LunicLynx