繁体   English   中英

如何在没有数据注释和 model 的情况下实现自定义属性验证

[英]How to implement custom property validation without data annotations and model

我需要动态构建一个表单,还需要包含每个属性的验证。 我有一个清单:

public class Field
{
    public string Label { get; set; }
    public string Value { get; set; }
}

形式是:

<EditForm OnValidSubmit="@OnValidSubmit" OnInvalidSubmit="@OnInvalidSubmit" EditContext="@editContext">
    <DataAnnotationsValidator />
    <CustomFieldValidator @ref="validator" />
    <DxFormLayout CaptionPosition="CaptionPosition.Vertical">
        @{
            foreach (var field in fields)
            {
                <DxFormLayoutItem Caption="@field.Label" ColSpanMd="6" BeginRow="true">
                    <Template Context="editContext">
                        <DxTextBox @bind-Text="@field.Value" BindValueMode="BindValueMode.OnInput" />
                        <ValidationMessage For="@(() => field.Value)" />
                    </Template>
                </DxFormLayoutItem>
            }
        }
        <DxFormLayoutItem ColSpanMd="12">
            <Template Context="editContext">
                <DxButton RenderStyle="ButtonRenderStyle.Primary" RenderStyleMode="ButtonRenderStyleMode.Contained" SubmitFormOnClick="true" Text="Send" />
            </Template>
        </DxFormLayoutItem>
    </DxFormLayout>
    <ValidationSummary />
</EditForm>

我已经按照 MS Docs 实现了自定义验证器,并且当前的解决方案使用验证摘要按预期工作。

但是, <ValidationMessage For... />根本不起作用。

我怎样才能让每个属性验证工作?

请注意,这不是答案,但评论中没有足够的空间来分享这个。

我看不到所有代码,但稍微解释一下可能会帮助您理解您的问题。 ValidationSummary将从ValidationMessageStore中获取所有消息,因此您的验证器正在编写消息。 问题是当您将消息记录到商店时,您如何构建商店使用的FieldIdentifier来标记消息,然后ValidationMessage如何使用FieldIdentifier选择要显示的正确消息。

您的验证器将执行以下操作:

var fi = new FieldIdentifier(this.Model, this.FieldName);
this.ValidationMessageStore.Add(fi, this.Messages);

ValidationMessage 正在做:

_fieldIdentifier = FieldIdentifier.Create(For);

FieldIdentifier For

EditContext.GetValidationMessages(_fieldIdentifier)

获取_fieldIdentifier的消息。

您的问题是您使用的是字段列表,而FieldIdentifier并不能真正满足这一点。

也许您应该考虑自定义ValidationMessage 此处获取 AspNetCore Repo的代码。

我目前正在研究自定义验证器以及如何解决这个问题,但我还没有可以分享的代码。

我的你可以像下面这样尝试并获得解决方法!

在视图中放入以下代码:

  @Html.ValidationMessageFor(model => model.Label)
  @Html.ValidationMessageFor(model => model.Value)

然后在您的 controller 中输入以下代码:

ModelState.AddModelError("Label", "Error Message for Label Property")
ModelState.AddModelError("Value", "Error Message for Value Property")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM