我试图将MongoDB类模型链接到Blazor页面组件。我试着保留所有的系统。组件模型。数据注释。ValidationAttribute到一个接口,并让带有Bson装饰的"real"类分开为:
public interface ITestIt
{
int id { get; set; }
[Required(ErrorMessage = "Material cost is required")]
[StringLength(5, ErrorMessage = "Name is too long.")]
string MyName { get; set; }
}
public class TestIt : ITestIt
{
[BsonId]
public int id { get; set; }
public string MyName { get; set; }
}
并将其作为包含在我的页面中
<h1>Hello, world!</h1>
Welcome to your new app.
<EditForm Model=@testIt OnValidSubmit="HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<div class="form-group">
<label for="Name">Name</label>
<InputText @bind-Value=testIt.MyName class="form-control" id="Name" />
<ValidationMessage For="() => testIt.MyName" Description="Salut" />
</div>
<input type="submit" class="btn btn-primary" value="Save" />
</EditForm>
@code{
private ITestIt testIt;
private bool IsDone = false;
protected override async Task OnInitializedAsync()
{
if (IsDone) return;
testIt = new TestIt();
IsDone = true;
}
private void HandleValidSubmit()
{
Console.WriteLine("OnValidSubmit");
}
但它不起作用,在不必用DataAnnotations标记装饰我的所有数据模型,也不必逐个将每个属性逐个复制到另一个对象的情况下,将两者分离的最佳方法是什么?
谢谢!
我不认为Blazor反映接口的数据注释,只反映实现对象的属性。
我将我的验证完全放在一个单独的项目中。为此,我使用FluentValidation。
您可以编写一个接受EditContext
作为级联参数的组件,挂接到它请求验证的事件中,并执行FluentValidation代码。
或者您可以使用预先制作的库,例如https://www.nuget.org/packages/PeterLeslieMorris.Blazor.FluentValidation/