Укажите, какие свойства DataAnnotationsValidator должны проверять - PullRequest
0 голосов
/ 27 апреля 2020

У меня бритвенный компонент с EditForm и DataAnnotationsValidator. Форма имеет поля ввода для одного свойства, но моя модель имеет два обязательных свойства. Можно ли точно указать свойства, которые должны быть проверены? Конечно, я мог бы присвоить свойству значение в коде, но было бы неплохо избежать этого.

Мой код выглядит так:

@page "/counter"

<EditForm EditContext="@_editContext">

    <DataAnnotationsValidator />
    <ValidationSummary />
    <div class="form-group">
        <label class="control-label">Name:</label>
        <InputText @bind-Value="_model.Name" class="form-control" />
        <ValidationMessage For="@(() => _model.Name)" />
    </div>

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

@code {

    class MyModel
    {
        [System.ComponentModel.DataAnnotations.Required]
        public string Name { get; set; }

        [System.ComponentModel.DataAnnotations.Required]
        public string Email { get; set; }
    }

    private EditContext _editContext;
    private MyModel _model = new MyModel();

    protected override void OnInitialized()
    {
        _editContext = new EditContext(_model);
    }
}

1 Ответ

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

Поддержка валидации DataAnnotations для Blazor предназначена для работы как с полем формы, так и с общей моделью в контексте редактирования. Вы можете расширить поведение проверки согласно инструкциям в документации здесь.

РЕДАКТИРОВАТЬ Один способ, которым это все еще может работать, - опустить строка <ValidationSummary /> внутри компонента EditForm, и сохраните отдельный <ValidationMessage /> для каждого поля формы. Вы теряете общее резюме, но оно будет работать.

В качестве альтернативы вы также можете ограничить Контекст в инициализированном методе значением _editContext = new EditContext(_model.Name);, поэтому вы рассматриваете только свойство Name в контексте редактирования, однако это приведет к исключению нулевой ссылки, если вы также не настроите свой MyModel.Name свойство для инициализации в пустую строку, например, так: public string Name { get; set; } = "";. В этом случае вы должны добавить еще одну аннотацию данных к Name, чтобы указать минимальную длину, чтобы убедиться, что пользователь все еще должен что-то вводить.

Возможно, больший вопрос в том, что если требуется адрес электронной почты, почему вы не фиксируете его и в форме? И наоборот, если вам не нужно захватывать его, зачем включать его в модель?

Более простой вариант для этого варианта использования - ограничить вашу модель только тем, с чем вы работаете напрямую. Если вам действительно нужно обойти проверку свойства Email, помните, что DataAnnotations, которым вы украшаете свои свойства, предназначены для работы с некоторой формой проверки. Вам может быть лучше использовать объект передачи данных в контексте этой формы только для того, что захватывает только того, что вам нужно в данный момент, например, свойство Name, и затем назначает его для более крупной модели в зависимости от ситуации с помощью programmati c Установить метод после того, как вы его проверили, а не то, что выполняет валидацию. Это, конечно, отрицательно сказывается на цели аннотации, поэтому подумайте над тем, что имеет смысл. Это зависит от вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...