Проверка в корпоративных приложенияхValidation in Enterprise Apps

Любое приложение, которое принимает входные данные от пользователей, следует убедиться, что ввод был допустимым.Any app that accepts input from users should ensure that the input is valid. Приложения например, проверьте наличие входных данных, который содержит только символы определенного диапазона, имеет определенную длину или совпадает с определенного формата.An app could, for example, check for input that contains only characters in a particular range, is of a certain length, or matches a particular format. Без проверки пользователь может передать данные, которые вызывают его сбой.Without validation, a user can supply data that causes the app to fail. Проверка применяет бизнес-правила и не позволяет злоумышленнику вставку вредоносных данных.Validation enforces business rules, and prevents an attacker from injecting malicious data.

В контексте объекта Model-View-ViewModel (MVVM) шаблона, модель представления или модели часто нужно будет выполнить проверку данных и сигнализировать об ошибок проверки в представление, таким образом, пользователь может их исправления.In the context of the Model-View-ViewModel (MVVM) pattern, a view model or model will often be required to perform data validation and signal any validation errors to the view so that the user can correct them. В мобильном приложении eShopOnContainers выполняет синхронные клиентскую проверку свойства модели представления и уведомляет пользователя об ошибках проверки, выделив элемент управления, который содержит недопустимые данные и отображения сообщений об ошибках, информирующие пользователя из почему данные недопустимы.The eShopOnContainers mobile app performs synchronous client-side validation of view model properties and notifies the user of any validation errors by highlighting the control that contains the invalid data, and by displaying error messages that inform the user of why the data is invalid. Рис. 6-1 показаны классы, включенные при выполнении проверки в мобильном приложении eShopOnContainers.Figure 6-1 shows the classes involved in performing validation in the eShopOnContainers mobile app.

Рис. 6-1: Классы проверки в мобильном приложении eShopOnContainersFigure 6-1: Validation classes in the eShopOnContainers mobile app

Просмотр свойств модели, требующих проверки имеют тип ValidatableObject<T>и каждый ValidatableObject<T> экземпляр имеет правила проверки, добавленные его Validations свойство.View model properties that require validation are of type ValidatableObject<T>, and each ValidatableObject<T> instance has validation rules added to its Validations property. Проверка вызывается из модели представления путем вызова Validate метод ValidatableObject<T> экземпляр, который извлекает проверки правил и выполняет их от ValidatableObject<T> Value свойство.Validation is invoked from the view model by calling the Validate method of the ValidatableObject<T> instance, which retrieves the validation rules and executes them against the ValidatableObject<T> Value property. Ошибки проверки, помещаются в Errors свойство ValidatableObject<T> экземпляр и IsValid свойство ValidatableObject<T> экземпляр обновляется, чтобы указать, успешно ли выполнена проверка.Any validation errors are placed into the Errors property of the ValidatableObject<T> instance, and the IsValid property of the ValidatableObject<T> instance is updated to indicate whether validation succeeded or failed.

Уведомления об изменении свойства обеспечивается ExtendedBindableObject класса и поэтому Entry управления можно привязать к IsValid свойство ValidatableObject<T> экземпляра в класс модели представления, чтобы получать уведомления о том, следует ли введенные данные является допустимым.Property change notification is provided by the ExtendedBindableObject class, and so an Entry control can bind to the IsValid property of ValidatableObject<T> instance in the view model class to be notified of whether or not the entered data is valid.

Указание правил проверкиSpecifying Validation Rules

Правила проверки настраиваются путем создания класса, производного от IValidationRule<T> интерфейс, который показан в следующем примере кода:Validation rules are specified by creating a class that derives from the IValidationRule<T> interface, which is shown in the following code example:

public interface IValidationRule<T>  
{  
    string ValidationMessage { get; set; }  
    bool Check(T value);  
}

Этот интерфейс определяет, что класс правило проверки должен предоставить boolean Check метод, который используется для выполнения проверки, и ValidationMessage свойства, значение которого представляет собой сообщение об ошибке проверки, которое будет отображаться, если Проверка не пройдена.This interface specifies that a validation rule class must provide a boolean Check method that is used to perform the required validation, and a ValidationMessage property whose value is the validation error message that will be displayed if validation fails.

В следующем коде показано в примере IsNotNullOrEmptyRule<T> правило проверки, который используется для проверки имени пользователя и пароль, введенный пользователем LoginView при использовании макеты служб в мобильном приложении eShopOnContainers:The following code example shows the IsNotNullOrEmptyRule<T> validation rule, which is used to perform validation of the username and password entered by the user on the LoginView when using mock services in the eShopOnContainers mobile app:

public class IsNotNullOrEmptyRule<T> : IValidationRule<T>  
{  
    public string ValidationMessage { get; set; }  

    public bool Check(T value)  
    {  
        if (value == null)  
        {  
            return false;  
        }  

        var str = value as string;  
        return !string.IsNullOrWhiteSpace(str);  
    }  
}

Check Возвращает boolean , указывающее, является ли аргумент значение null, пуст или состоит только из пробельных символов.The Check method returns a boolean indicating whether the value argument is null, empty, or consists only of whitespace characters.

Несмотря на то, что не используется в мобильном приложении eShopOnContainers, в следующем примере кода показано правило проверки для проверки адреса электронной почты:Although not used by the eShopOnContainers mobile app, the following code example shows a validation rule for validating email addresses:

public class EmailRule<T> : IValidationRule<T>  
{  
    public string ValidationMessage { get; set; }  

    public bool Check(T value)  
    {  
        if (value == null)  
        {  
            return false;  
        }  

        var str = value as string;  
        Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");  
        Match match = regex.Match(str);  

        return match.Success;  
    }  
}

Check Возвращает метод boolean , указывающее, является ли аргумент значение допустимый адрес электронной почты.The Check method returns a boolean indicating whether or not the value argument is a valid email address. Это достигается путем поиска значение аргумента для первого экземпляра шаблон регулярного выражения, указанного в Regex конструктор.This is achieved by searching the value argument for the first occurrence of the regular expression pattern specified in the Regex constructor. Ли находится шаблон регулярного выражения во входной строке можно определить с помощью проверки значения Match объекта Success свойство.Whether the regular expression pattern has been found in the input string can be determined by checking the value of the Match object's Success property.

Примечание

Проверка свойства иногда может включать в себя зависимые свойства.Property validation can sometimes involve dependent properties. Пример зависимые свойства — когда набор допустимых значений для типа свойства зависит от определенное значение, которое было задано в свойстве б. Чтобы проверить, что значение свойства типа является одним из допустимых значений будет включать в себя извлечение значения свойства б. Кроме того при изменении значения свойства B, свойства типа необходимо быть проверено повторно.An example of dependent properties is when the set of valid values for property A depends on the particular value that has been set in property B. To check that the value of property A is one of the allowed values would involve retrieving the value of property B. In addition, when the value of property B changes, property A would need to be revalidated.

Добавление правил проверки к свойствуAdding Validation Rules to a Property

В мобильном приложении eShopOnContainers, объявляются свойства модели представления, требующих проверки типа ValidatableObject<T>, где T — это тип данных для проверки.In the eShopOnContainers mobile app, view model properties that require validation are declared to be of type ValidatableObject<T>, where T is the type of the data to be validated. В следующем примере кода показан пример двух свойств:The following code example shows an example of two such properties:

public ValidatableObject<string> UserName  
{  
    get  
    {  
        return _userName;  
    }  
    set  
    {  
        _userName = value;  
        RaisePropertyChanged(() => UserName);  
    }  
}  

public ValidatableObject<string> Password  
{  
    get  
    {  
        return _password;  
    }  
    set  
    {  
        _password = value;  
        RaisePropertyChanged(() => Password);  
    }  
}

Чтобы выполнялась проверка, необходимо добавить правила проверки Validations коллекцию каждого ValidatableObject<T> экземпляра, как показано в следующем примере кода:For validation to occur, validation rules must be added to the Validations collection of each ValidatableObject<T> instance, as demonstrated in the following code example:

private void AddValidations()  
{  
    _userName.Validations.Add(new IsNotNullOrEmptyRule<string>   
    {   
        ValidationMessage = "A username is required."   
    });  
    _password.Validations.Add(new IsNotNullOrEmptyRule<string>   
    {   
        ValidationMessage = "A password is required."   
    });  
}

Этот метод добавляет IsNotNullOrEmptyRule<T> для правила проверки Validations коллекцию каждого ValidatableObject<T> экземпляр, указав значения для правила проверки ValidationMessage свойство, которое указывает сообщение об ошибке проверки, которое будет отображаться, если Проверка не пройдена.This method adds the IsNotNullOrEmptyRule<T> validation rule to the Validations collection of each ValidatableObject<T> instance, specifying values for the validation rule's ValidationMessage property, which specifies the validation error message that will be displayed if validation fails.

Активируя проверкуTriggering Validation

Способ проверки в мобильном приложении eShopOnContainers можно вручную запустить проверку свойства и автоматически проверки триггера при изменении свойства.The validation approach used in the eShopOnContainers mobile app can manually trigger validation of a property, and automatically trigger validation when a property changes.

Активации проверки вручнуюTriggering Validation Manually

Проверка может инициироваться вручную для свойства модели представления.Validation can be triggered manually for a view model property. Например, это происходит в мобильном приложении eShopOnContainers, когда пользователь касается входа кнопку LoginView, при использовании службы имитации.For example, this occurs in the eShopOnContainers mobile app when the user taps the Login button on the LoginView, when using mock services. Она вызывает делегат MockSignInAsync метод в LoginViewModel, который вызывает проверку, выполнив Validate метод, который показан в следующем примере кода:The command delegate calls the MockSignInAsync method in the LoginViewModel, which invokes validation by executing the Validate method, which is shown in the following code example:

private bool Validate()  
{  
    bool isValidUser = ValidateUserName();  
    bool isValidPassword = ValidatePassword();  
    return isValidUser && isValidPassword;  
}  

private bool ValidateUserName()  
{  
    return _userName.Validate();  
}  

private bool ValidatePassword()  
{  
    return _password.Validate();  
}

Validate Метод выполняет проверку имени пользователя и пароль, введенный пользователем LoginView, путем вызова метода Validate в каждом ValidatableObject<T> экземпляра.The Validate method performs validation of the username and password entered by the user on the LoginView, by invoking the Validate method on each ValidatableObject<T> instance. В следующем примере кода показан метод Validate из ValidatableObject<T> класса:The following code example shows the Validate method from the ValidatableObject<T> class:

public bool Validate()  
{  
    Errors.Clear();  

    IEnumerable<string> errors = _validations  
        .Where(v => !v.Check(Value))  
        .Select(v => v.ValidationMessage);  

    Errors = errors.ToList();  
    IsValid = !Errors.Any();  

    return this.IsValid;  
}

Этот метод очищает Errors коллекции, а затем извлекает какой-либо проверки правил, которые были добавлены в объект Validations коллекции.This method clears the Errors collection, and then retrieves any validation rules that were added to the object's Validations collection. Check Метод для каждого полученного условие выполняется и ValidationMessage добавляется значение свойства для любого правила проверки, который не удается проверить данные Errors коллекцию ValidatableObject<T> экземпляра.The Check method for each retrieved validation rule is executed, and the ValidationMessage property value for any validation rule that fails to validate the data is added to the Errors collection of the ValidatableObject<T> instance. Наконец IsValid свойство установлено, а его значение возвращается в вызывающий метод, указывающее, успешно ли выполнена проверка.Finally, the IsValid property is set, and its value is returned to the calling method, indicating whether validation succeeded or failed.

Активируя проверку при изменении свойствTriggering Validation when Properties Change

Проверка также может запускаться при каждом изменении связанного свойства.Validation can also be triggered whenever a bound property changes. Например, когда двухстороннюю привязку в LoginView задает UserName или Password активируется свойства проверки.For example, when a two-way binding in the LoginView sets the UserName or Password property, validation is triggered. В следующем примере кода показано, как это происходит:The following code example demonstrates how this occurs:

<Entry Text="{Binding UserName.Value, Mode=TwoWay}">  
    <Entry.Behaviors>  
        <behaviors:EventToCommandBehavior  
            EventName="TextChanged"  
            Command="{Binding ValidateUserNameCommand}" />  
    </Entry.Behaviors>  
    ...  
</Entry>

Entry Привязан элемент управления UserName.Value свойство ValidatableObject<T> экземпляра и элемента управления Behaviors коллекция имеет EventToCommandBehavior экземпляра, добавить к ним.The Entry control binds to the UserName.Value property of the ValidatableObject<T> instance, and the control's Behaviors collection has an EventToCommandBehavior instance added to it. Это поведение выполняет ValidateUserNameCommand в ответ на [TextChanged] запуск события на Entry, которое вызывается, когда текст в Entry изменения.This behavior executes the ValidateUserNameCommand in response to the [TextChanged] event firing on the Entry, which is raised when the text in the Entry changes. В свою очередь ValidateUserNameCommand выполняет делегат ValidateUserName метод, который выполняет Validate метод ValidatableObject<T> экземпляра.In turn, the ValidateUserNameCommand delegate executes the ValidateUserName method, which executes the Validate method on the ValidatableObject<T> instance. Таким образом, каждый раз пользователь вводит символ в Entry выполняется элемента управления для имени пользователя, проверка введенных данных.Therefore, every time the user enters a character in the Entry control for the username, validation of the entered data is performed.

Дополнительные сведения о поведениях см. в разделе реализации поведения.For more information about behaviors, see Implementing Behaviors.

Отображение ошибок проверкиDisplaying Validation Errors

В мобильном приложении eShopOnContainers уведомляет пользователя об ошибках проверки выделив элемент управления, который содержит недопустимые данные с красной линией, и, отображая сообщение об ошибке, сообщающее, почему данные недопустимы ниже управления, содержащего недопустимые данные.The eShopOnContainers mobile app notifies the user of any validation errors by highlighting the control that contains the invalid data with a red line, and by displaying an error message that informs the user why the data is invalid below the control containing the invalid data. При исправляется недопустимые данные, строки меняется на черный, и удаляется сообщение об ошибке.When the invalid data is corrected, the line changes to black and the error message is removed. Рис. 6-2 показано LoginView в мобильном приложении eShopOnContainers, при наличии ошибок проверки.Figure 6-2 shows the LoginView in the eShopOnContainers mobile app when validation errors are present.

Рис. 6-2. Отображение ошибок проверки во время входаFigure 6-2: Displaying validation errors during login

Выделите элемент управления, который содержит недопустимые данные.Highlighting a Control that Contains Invalid Data

LineColorBehavior Вложенное поведение, используемым для выделения Entry элементов управления, где произошли ошибки проверки.The LineColorBehavior attached behavior is used to highlight Entry controls where validation errors have occurred. В следующем примере кода показано как LineColorBehavior прикреплено поведение присоединенного Entry управления:The following code example shows how the LineColorBehavior attached behavior is attached to an Entry control:

<Entry Text="{Binding UserName.Value, Mode=TwoWay}">
    <Entry.Style>
        <OnPlatform x:TypeArguments="Style">
            <On Platform="iOS, Android" Value="{StaticResource EntryStyle}" />
            <On Platform="UWP" Value="{StaticResource UwpEntryStyle}" />
        </OnPlatform>
    </Entry.Style>
    ...
</Entry>

Entry Управления использует явный стиль, который показан в следующем примере кода:The Entry control consumes an explicit style, which is shown in the following code example:

<Style x:Key="EntryStyle"  
       TargetType="{x:Type Entry}">  
    ...  
    <Setter Property="behaviors:LineColorBehavior.ApplyLineColor"  
            Value="True" />  
    <Setter Property="behaviors:LineColorBehavior.LineColor"  
            Value="{StaticResource BlackColor}" />  
    ...  
</Style>

Этот стиль устанавливает ApplyLineColor и LineColor вложенные свойства LineColorBehavior подключить поведение на Entry элемента управления.This style sets the ApplyLineColor and LineColor attached properties of the LineColorBehavior attached behavior on the Entry control. Дополнительные сведения о стилях см. в статье Стили.For more information about styles, see Styles.

Если значение ApplyLineColor вложенное свойство является набор или изменения, LineColorBehavior выполняет вложенное поведение OnApplyLineColorChanged метод, который показан в следующем примере кода:When the value of the ApplyLineColor attached property is set, or changes, the LineColorBehavior attached behavior executes the OnApplyLineColorChanged method, which is shown in the following code example:

public static class LineColorBehavior  
{  
    ...  
    private static void OnApplyLineColorChanged(  
                BindableObject bindable, object oldValue, object newValue)  
    {  
        var view = bindable as View;  
        if (view == null)  
        {  
            return;  
        }  

        bool hasLine = (bool)newValue;  
        if (hasLine)  
        {  
            view.Effects.Add(new EntryLineColorEffect());  
        }  
        else  
        {  
            var entryLineColorEffectToRemove =   
                    view.Effects.FirstOrDefault(e => e is EntryLineColorEffect);  
            if (entryLineColorEffectToRemove != null)  
            {  
                view.Effects.Remove(entryLineColorEffectToRemove);  
            }  
        }  
    }  
}

Параметры для этого метода укажите экземпляр элемента управления, к которой подключен поведение и старые и новые значения ApplyLineColor вложенного свойства зависимостей.The parameters for this method provide the instance of the control that the behavior is attached to, and the old and new values of the ApplyLineColor attached property. EntryLineColorEffect Класс добавляется к элементу управления Effects коллекции Если ApplyLineColor присоединенное свойство true, в противном случае он удаляется из элемента управления Effects коллекции.The EntryLineColorEffect class is added to the control's Effects collection if the ApplyLineColor attached property is true, otherwise it's removed from the control's Effects collection. Дополнительные сведения о поведениях см. в разделе реализации поведения.For more information about behaviors, see Implementing Behaviors.

EntryLineColorEffect Подклассы RoutingEffect класса и показано в следующем примере кода:The EntryLineColorEffect subclasses the RoutingEffect class, and is shown in the following code example:

public class EntryLineColorEffect : RoutingEffect  
{  
    public EntryLineColorEffect() : base("eShopOnContainers.EntryLineColorEffect")  
    {  
    }  
}

RoutingEffect Класс представляет эффект независимо от платформы, который создает оболочку для внутреннего эффект, зависит от платформы.The RoutingEffect class represents a platform-independent effect that wraps an inner effect that's platform-specific. Это упрощает процесс удаления эффекта, так как отсутствует доступ времени компиляции к сведениям о типе для определяемого платформой эффекта.This simplifies the effect removal process, since there is no compile-time access to the type information for a platform-specific effect. EntryLineColorEffect Вызывает конструктор базового класса, передав в качестве параметра, состоящий из объединение имени группы разрешения и уникальный идентификатор, указанный для каждого класса эффект от платформы.The EntryLineColorEffect calls the base class constructor, passing in a parameter consisting of a concatenation of the resolution group name, and the unique ID that's specified on each platform-specific effect class.

В следующем коде показано в примере eShopOnContainers.EntryLineColorEffect реализацию для операций ввода-вывода:The following code example shows the eShopOnContainers.EntryLineColorEffect implementation for iOS:

[assembly: ResolutionGroupName("eShopOnContainers")]  
[assembly: ExportEffect(typeof(EntryLineColorEffect), "EntryLineColorEffect")]  
namespace eShopOnContainers.iOS.Effects  
{  
    public class EntryLineColorEffect : PlatformEffect  
    {  
        UITextField control;  

        protected override void OnAttached()  
        {  
            try  
            {  
                control = Control as UITextField;  
                UpdateLineColor();  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Can't set property on attached control. Error: ", ex.Message);  
            }  
        }  

        protected override void OnDetached()  
        {  
            control = null;  
        }  

        protected override void OnElementPropertyChanged(PropertyChangedEventArgs args)  
        {  
            base.OnElementPropertyChanged(args);  

            if (args.PropertyName == LineColorBehavior.LineColorProperty.PropertyName ||  
                args.PropertyName == "Height")  
            {  
                Initialize();  
                UpdateLineColor();  
            }  
        }  

        private void Initialize()  
        {  
            var entry = Element as Entry;  
            if (entry != null)  
            {  
                Control.Bounds = new CGRect(0, 0, entry.Width, entry.Height);  
            }  
        }  

        private void UpdateLineColor()  
        {  
            BorderLineLayer lineLayer = control.Layer.Sublayers.OfType<BorderLineLayer>()  
                                                             .FirstOrDefault();  

            if (lineLayer == null)  
            {  
                lineLayer = new BorderLineLayer();  
                lineLayer.MasksToBounds = true;  
                lineLayer.BorderWidth = 1.0f;  
                control.Layer.AddSublayer(lineLayer);  
                control.BorderStyle = UITextBorderStyle.None;  
            }  

            lineLayer.Frame = new CGRect(0f, Control.Frame.Height-1f, Control.Bounds.Width, 1f);  
            lineLayer.BorderColor = LineColorBehavior.GetLineColor(Element).ToCGColor();  
            control.TintColor = control.TextColor;  
        }  

        private class BorderLineLayer : CALayer  
        {  
        }  
    }  
}

OnAttached Метод получает собственный элемент управления для Xamarin.Forms Entry управления и обновляет цвет линии, вызвав UpdateLineColor метод.The OnAttached method retrieves the native control for the Xamarin.Forms Entry control, and updates the line color by calling the UpdateLineColor method. OnElementPropertyChanged Переопределение реагирует на изменения может быть привязано на Entry управления, обновив цвет линии, если вложенный LineColor изменения свойств или Height свойство Entryизменения.The OnElementPropertyChanged override responds to bindable property changes on the Entry control by updating the line color if the attached LineColor property changes, or the Height property of the Entry changes. Дополнительные сведения об эффектах см. в статье Эффекты.For more information about effects, see Effects.

При вводе допустимые данные в Entry элемента управления, он будет применяться черная линия к нижней части элемента управления, чтобы указать, что отсутствуют ошибки проверки.When valid data is entered in the Entry control, it will apply a black line to the bottom of the control, to indicate that there is no validation error. Рис. 6-3 показан пример этого.Figure 6-3 shows an example of this.

Рис. 6-3: Указывающее, ошибки проверки не черная линияFigure 6-3: Black line indicating no validation error

Entry Элемент управления также имеет DataTrigger добавляемый его Triggers коллекции.The Entry control also has a DataTrigger added to its Triggers collection. В следующем коде показано в примере DataTrigger:The following code example shows the DataTrigger:

<Entry Text="{Binding UserName.Value, Mode=TwoWay}">  
    ...  
    <Entry.Triggers>  
        <DataTrigger   
            TargetType="Entry"  
            Binding="{Binding UserName.IsValid}"  
            Value="False">  
            <Setter Property="behaviors:LineColorBehavior.LineColor"   
                    Value="{StaticResource ErrorColor}" />  
        </DataTrigger>  
    </Entry.Triggers>  
</Entry>

Это DataTrigger мониторы UserName.IsValid свойство и если это значение становится false, он выполняет Setter , какие изменения LineColor подключен Свойство LineColorBehavior подключить поведение к красному.This DataTrigger monitors the UserName.IsValid property, and if it's value becomes false, it executes the Setter, which changes the LineColor attached property of the LineColorBehavior attached behavior to red. Рис. 6-4 показан пример этого.Figure 6-4 shows an example of this.

Рис. 6-4: Красная линия, указывающих на ошибку проверкиFigure 6-4: Red line indicating validation error

В строке Entry элемент управления останется красным, а введенные данные недопустимы, в противном случае он изменится на черный, чтобы указать, что введенные данные является допустимым.The line in the Entry control will remain red while the entered data is invalid, otherwise it will change to black to indicate that the entered data is valid.

Дополнительные сведения о триггерах см. в разделе триггеры.For more information about Triggers, see Triggers.

Отображение сообщения об ошибкахDisplaying Error Messages

Пользовательский Интерфейс отображает сообщения об ошибках проверки в элементы управления Label ниже каждый элемент управления, данные которых не прошло проверку.The UI displays validation error messages in Label controls below each control whose data failed validation. В следующем коде показано в примере Label , отображающий сообщение об ошибке проверки, если пользователь не ввел допустимое имя пользователя:The following code example shows the Label that displays a validation error message if the user has not entered a valid username:

<Label Text="{Binding UserName.Errors, Converter={StaticResource FirstValidationErrorConverter}}"  
       Style="{StaticResource ValidationErrorLabelStyle}" />

Каждый Label привязывается к Errors свойство объекта модели представления, который проверяется.Each Label binds to the Errors property of the view model object that's being validated. Errors Предоставляется свойство ValidatableObject<T> класса и имеет тип List<string>.The Errors property is provided by the ValidatableObject<T> class, and is of type List<string>. Так как Errors свойство может содержать несколько ошибок проверки, FirstValidationErrorConverter экземпляр используется для извлечения из коллекции для отображения первой ошибки.Because the Errors property can contain multiple validation errors, the FirstValidationErrorConverter instance is used to retrieve the first error from the collection for display.

СводкаSummary

В мобильном приложении eShopOnContainers выполняет синхронные клиентскую проверку свойства модели представления и уведомляет пользователя об ошибках проверки, выделив элемент управления, который содержит недопустимые данные и отображения сообщений об ошибках, информирующие пользователя Почему данные недопустимы.The eShopOnContainers mobile app performs synchronous client-side validation of view model properties and notifies the user of any validation errors by highlighting the control that contains the invalid data, and by displaying error messages that inform the user why the data is invalid.

Просмотр свойств модели, требующих проверки имеют тип ValidatableObject<T>и каждый ValidatableObject<T> экземпляр имеет правила проверки, добавленные его Validations свойство.View model properties that require validation are of type ValidatableObject<T>, and each ValidatableObject<T> instance has validation rules added to its Validations property. Проверка вызывается из модели представления путем вызова Validate метод ValidatableObject<T> экземпляр, который извлекает проверки правил и выполняет их от ValidatableObject<T> Value свойство.Validation is invoked from the view model by calling the Validate method of the ValidatableObject<T> instance, which retrieves the validation rules and executes them against the ValidatableObject<T> Value property. Ошибки проверки, помещаются в Errors свойство ValidatableObject<T>экземпляр и IsValid свойство ValidatableObject<T> экземпляр обновляется, чтобы указать, успешно ли выполнена проверка.Any validation errors are placed into the Errors property of the ValidatableObject<T>instance, and the IsValid property of the ValidatableObject<T> instance is updated to indicate whether validation succeeded or failed.