在将视图数据设置到模型中之前对其进行验证

时间:2020-05-27 07:06:21

标签: validation blazor blazor-validation

我的模型对象表面上很简单,我认为它不值得描述我的模型,但是一个很好的类比是一个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;}
    }
}

0 个答案:

没有答案