[英]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.