Как проверить соответствие двух полей с помощью DataAnnotationsValidator в Blazor? - PullRequest
0 голосов
/ 05 апреля 2020

Я довольно новичок в разработке и пытаюсь освоить C# разработку с помощью Blazor. В настоящее время я учусь создавать формы, используя EditForms, и проверять, используя DataAnnotationsValidator.

Я успешно сделал большую часть того, что мне нужно сделать для проверки, прежде чем перейти к обработке формы, однако у меня возникли проблемы с одним важным аспектом проверки: форма, над которой я работаю, - это регистрационная форма для нового пользователя. Как правило, при регистрации новых пользователей пользователь может sh повторно ввести значение, например адрес электронной почты или пароль, чтобы убедиться, что они ввели его правильно:

    <InputText @bind-Value=User.email id="email" /><br />
    <ValidationMessage For=@( () => User.email) />
    <label for="confirm">Confirm Email</label><br />
    <InputText @bind-Value=User.confirm id="confirm"/><br />

Чтобы проверить эти поля У меня есть класс UserModel, который я создал как User ().

@code
{
    UserModel User = new UserModel();

    class UserModel
    {
        [Required]
        [EmailAddress(ErrorMessage = "Please enter a valid email address.")]
        public string email { get; set; }
        [Required]
        [EmailAddress(ErrorMessage = "Please confirm your email address.")]
        [Compare(email, ErrorMessage = "The email addresses you entered did not match.")]
        public string confirm { get; set; }
        public string fname { get; set; }
        public string lname { get; set; }
        public string pwd { get; set; }

        public string error = "";

        public void Submit()
        {
        }
    }

В документации Microsoft для DataAnnotationsValidator я обнаружил класс CompareAttribute, который, согласно документации, предоставляет атрибут, который сравнивает два свойства ". Я верю, что это будет делать то, что мне нужно, но у меня возникли проблемы с его использованием. Compare принимает аргумент otherProperty, который, как я считаю, будет другим пользовательским вводом, который я пытаюсь сопоставить, однако я не могу понять, как передать предыдущий ввод в качестве этого аргумента.

Я пробовал email,, однако ссылка на объект обязательна. Не похоже, что я бы хотел ссылаться на экземпляр класса внутри самого класса, поэтому я попытался this.email, но получил ошибку «Ключевое слово« this »недоступно в текущем контексте».

Если бы кто-нибудь мог помочь мне найти правильный способ использования класса Compare в моей ситуации, я был бы очень признателен. В противном случае, если я лаю не на том дереве, пожалуйста, дайте мне знать. Спасибо!

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Для приложений Blazor Microsoft создала новый пакет NuGet Microsoft.AspNetCore.Components.DataAnnotations.Validation для использования с DataAnnotationsValidator . Эта библиотека определяет атрибут [CompareProperty] в том же пространстве имен, что и прежний атрибут [Compare], для которого он является прямой заменой.

Рабочий пример:

@using System.ComponentModel.DataAnnotations;

<EditForm Model="@_user" OnValidSubmit="HandleValidSubmit">
    <DataAnnotationsValidator />
    <ValidationSummary />

    <label>
        Email:
        <InputText @bind-Value="_user.Email" />
    </label>
    <label>
        Confirm:
        <InputText @bind-Value="_user.ConfirmEmail" />
    </label>

    <button type="submit">Submit</button>
</EditForm>

@code {
    private User _user = new User();

    private void HandleValidSubmit()
    {
        Console.WriteLine("OnValidSubmit");
    }

    public class User
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [CompareProperty("Email")]
        public string ConfirmEmail { get; set; }
    }
}

Подробнее о том, почему использование атрибута [Compare] нежелательно для приложения Blazor , можно узнать из документации .

1 голос
/ 05 апреля 2020

На мой вопрос ответили в этом сообщении stackoverflow.com/a/13237249/842935 (спасибо Dani Herrera за указание на это).

Аргумент - это строка, представляющая имя свойства, которое вы пытаетесь сравнить с. Таким образом, следующий код сделает то, что я пытался выполнить sh:

[Compare("email", ErrorMessage = "The email addresses you entered did not match.")]
...