Добавить недопустимое свойство child в child - PullRequest
2 голосов
/ 22 января 2020

Я новичок в FluentValidation.

У меня есть два класса

public class A
{
    public B Prop { get; set; }
}

public class B 
{
    public decimal? Example { get; set; }
    public decimal? Example2 { get; set; }
}

И я пытаюсь проверить свойство B внутри A класса.

Если какое-либо свойство Prop имеет ошибку проверки, я хочу установить первую из ошибок для поддержки объекта.

Я пытаюсь вот так:

public class A : AbstractValidator<A>{    
    public A()
    {
        RuleFor(x => x.Prop.Example).NotEmpty();
        RuleFor(x => x.Prop.Example2).NotEmpty();
        RuleFor(x => x.Prop).Custom((obj,context) => {
            if(/* obj.Example or obj.Example2 has validation error */){
                context.AddFailure("message of any Example or Example2 errors");
            }
        });
    }
}

Редактировать : какой-то пример моего взгляда

<div class="col-12 col-lg-6">
    @Html.LabelFor(x => x.Prop, new { @class = "col-form-label" })
    <div class="input-group mb-3">
        @Html.EditorFor(x => x.Prop.Example, new { htmlAttributes = new { @class = "form-control" } })
        <div class="input-group-append">
            <span class="input-group-text">%</span>
            <span class="input-group-text">@@</span>
        </div>
        @Html.EditorFor(x => x.Prop.Example2, new { htmlAttributes = new { @class = "form-control" } })
        <div class="input-group-append">
            <span class="input-group-text">KVA</span>
        </div>
        <div class="invalid-feedback">@Html.ValidationMessageFor(x => x.Prop)</div>
    </div>
</div>

Он должен отображать примерно так:

enter image description here

Где левый ввод - Пример, и правильный пример - Пример 2.

Итак, если что-то из этого не получилось, сообщение об ошибке должно быть отображено вниз (ValidationMessageFor)

Я не знаю, как проверить Prop ошибок свойств внутри a RuleFor

Возможно ли так? Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Вы могли бы , вероятно, заставить это работать, но вам может быть проще, создав валидатор для класса B и затем поместив оба сообщения проверки в пользовательском интерфейсе рядом друг с другом:

<div class="col-12 col-lg-6">
    @Html.LabelFor(x => x.Prop, new { @class = "col-form-label" })
    <div class="input-group mb-3">
        @Html.EditorFor(x => x.Prop.Example, new { htmlAttributes = new { @class = "form-control" } })
        <div class="input-group-append">
            <span class="input-group-text">%</span>
            <span class="input-group-text">@@</span>
        </div>
        @Html.EditorFor(x => x.Prop.Example2, new { htmlAttributes = new { @class = "form-control" } })
        <div class="input-group-append">
            <span class="input-group-text">KVA</span>
        </div>
        <div class="invalid-feedback">
            @* Validation messages for both properties of class "B" *@
            @Html.ValidationMessageFor(x => x.Prop.Example)
            @Html.ValidationMessageFor(x => x.Prop.Example2)
        </div>
    </div>
</div>
0 голосов
/ 22 января 2020

Я думаю, вы можете использовать документацию FluentValidation для создания собственного валидатора для класса B . https://fluentvalidation.net/start#creating -your-first-validator

Затем в основной области функции вы можете просто вызвать этот валидатор для класса B.

...