Я писал код MVC, где я использовал ValidationAttributes для модели, например - RequiredAttribute, RangeAttribute и т. Д. Я просто не понимаю, как они работают внутренне.У меня есть CustomAttribute, производный от ValidationAttribute, где IsValid был переопределен и была сделана некоторая пользовательская проверка. Когда я ставил точку останова на свой CustomAttribute, он вызывался при обновлении модели, что имеет смысл.Однако я не понимаю, где объект передается в атрибут.Как и почему вызывается метод.
1. В Visual Studio я продолжаю проверять определения атрибутов, и, кажется, что-то не хватает.Как объект, к которому применяется атрибут, передается в класс / объект атрибута (является ли объект атрибута даже созданным?) 2. Я зашел в мой каталог - C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \v4.7 и перетащил System.ComponentModel.DataAnnotations.dll в только что откомпилированное окно.Я не вижу никаких реализаций вообще.IsValid имеет пустое тело.
namespace System.ComponentModel.DataAnnotations
{
//
// Summary:
// Specifies that a data field value is required.
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class RequiredAttribute : ValidationAttribute
{
//
// Summary:
// Initializes a new instance of the System.ComponentModel.DataAnnotations.RequiredAttribute
// class.
public RequiredAttribute();
//
// Summary:
// Gets or sets a value that indicates whether an empty string is allowed.
//
// Returns:
// true if an empty string is allowed; otherwise, false. The default value is false.
public bool AllowEmptyStrings { get; set; }
//
// Summary:
// Checks that the value of the required data field is not empty.
//
// Parameters:
// value:
// The data field value to validate.
//
// Returns:
// true if validation is successful; otherwise, false.
//
// Exceptions:
// T:System.ComponentModel.DataAnnotations.ValidationException:
// The data field value was null.
public override bool IsValid(object value);
}
}
Приведенный выше текст взят из метаданных при нажатии F12 для атрибута Required.Здесь IsValid имеет значение параметра.Но нет кода, который показывает, куда передается его вызываемый или параметр.
В качестве ответа я хотел бы увидеть пример кода, отсекаемый с возможно обязательным / Range / Conditional Attribute, примененным к методу / свойству (в зависимости от обстоятельств) и затем шаг за шагом, когда Атрибут действительно выполняет работу или если это не атрибут, то где выполняется работа.