我的模型对象表面上很简单,我认为它不值得描述我的模型,但是一个很好的类比是一个SQL连接字符串,它只是一个字符串,但是构造它的规则非常复杂,需要一个数字有条件的UI元素取决于数据库以及其他选项。
如果视图中的数据无效,则无法将其写回到模型中(假设数据库名称是带引号的字符串,如果用户输入了引号字符,则无法将其写入放入连接字符串中而不会使连接字符串变得不可读)。
blazor验证API需要使用模型对象,因此如何为blazor控件创建一个验证器,以针对无效的 view 字段报告错误。在这种情况下,模型只是ConnectionString字符串字段,尽管我可以为此编写一个自定义验证器,但是其中的数据可能无法表示视图中的数据,因为视图不能总是写入模型中。 / p>
使用代码更新
以下代码显示了该概念,我找不到在DatabaseInfoEditor中运行ConnectionStringViewModel的验证规则的方法。
class DatabaseInfoModel
{
[MaxLength(10)]
public string Name {get;set;}
[ValidateComplexType] // used to cause validation of child objects - but there is no child object to validate, what we want to validate is the ConnectionStringViewModel
public string ConnectionString {get;set;}
}
DatabaseInfoEditor.razor
<EditForm Model="MyDatabaseInfoModel">
<ObjectGraphDataAnnotationsValidator />
Name:<TextEditor @bind-Text="MyDatabaseInfoModel.Name"/>
<ConnectionStringEditor ConnectionString="MyDatabaseInfoModel.ConnectionString "/>
</EditForm>
ConnectionStringEditor.razor
Database:<TextEditor @bind-Text="MyConnectionStringViewModel.Database"/>
Username:<TextEditor @bind-Text="MyConnectionStringViewModel.Username"/>
@code
{
[Parameter]
public string ConnectionString {get;set;}
ConnectionStringViewModel MyConnectionStringViewModel;
override OnParameterSet()
{
base.OnParameterSet();
MyConnectionStringViewModel = PickApartConnectionString(ConnectionString);
}
class ConnectionStringViewModel
{
[MaxLength(10)]
public string Database {get;set;}
[MaxLength(10)]
public string Username {get;set;}
}
}