Мой объект модели внешне довольно прост, я не думаю, что его стоит описывать мою модель, но хорошей аналогией была бы строка подключения SQL, это просто строка, но правила ее создания довольно сложны, требуя количество условных элементов пользовательского интерфейса в зависимости от БД и других параметров.
Некоторые данные, которые у меня есть в представлении, не могут быть записаны обратно в Модель, если они недействительны (представьте, что имя базы данных заключено в кавычки строка, если пользователь вводит символ кавычки, он не может быть записан в строку подключения, не сделав строку подключения нечитаемой).
API проверки блазора требует, чтобы объект модели работал, так как создать валидатор для моего элемента управления Blazor, который сообщает об ошибках в недопустимых полях view . В этом случае модель представляет собой просто строковое поле ConnectionString, и хотя я мог бы написать для этого специальный валидатор, данные в нем могут не представлять данные в представлении, поскольку представление не всегда может быть записано в модель.
ОБНОВЛЕНО кодом
В следующем коде показана концепция. Я не могу найти способ, чтобы правила проверки в ConnectionStringViewModel выполнялись в DatabaseInfoEditor.
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;}
}
}