Validation 如何将动态表单字段添加到EditContext以在Blazor服务器应用程序中进行验证
我将RenderFragment添加到包含InputSelect和InputNumber字段的EditForm中。 它正在工作,但他们的验证不起作用。我想我应该在EditContext中添加,但我不知道如何添加。我试着在网上查找,但它们对我来说还很复杂。 添加BillComponent.razorValidation 如何将动态表单字段添加到EditContext以在Blazor服务器应用程序中进行验证,validation,fragment,blazor-server-side,Validation,Fragment,Blazor Server Side,我将RenderFragment添加到包含InputSelect和InputNumber字段的EditForm中。 它正在工作,但他们的验证不起作用。我想我应该在EditContext中添加,但我不知道如何添加。我试着在网上查找,但它们对我来说还很复杂。 添加BillComponent.razor <EditForm EditContext="@EditContext" OnSubmit="@HandleSubmit"> <DataA
<EditForm EditContext="@EditContext" OnSubmit="@HandleSubmit">
<DataAnnotationsValidator />
<label for="BillNumber">Bill number:</label>
<InputText @bind-Value="NewBillHeaderVM.BillNumber" />
<ValidationMessage For="@(() => NewBillHeaderVM.BillNumber" />
@foreach(var item in BillItemFragments)
{
@item;
}
<button type="submit">Save</button>
</EditForm>
<div>
<label for="NewBillItemVM.SelectedBillItemTypeId>Type:</label>
<InputSelect id="NewBillItemVM.SelectedTypeId" @bind-Value="@NewBillItemVM.SelectedBillItemTypeId">
@foreach(vat opt in BillItemTypes)
{
<option value=@opt.Value>@opt.Text</option>
}
</InputSelect>
<ValidationMessage for="@(() => NewBillItemVM.SelectedBillItemTypeId)" />
<label for="NewBillItemVM.Number>Number:</label>
<InputNumber id="NewBillItemVM.Number" @bind-Value="@NewBillItemVM.Number" />
<ValidationMessage for="@(() => NewBillItemVM.Number)" />
</div>
@code {
[Parameter]
public List<BillItemType> BillItemTypes { get; set; }
[Parameter]
public NewBillItemVM NewBillItemVM { get; set; }
}
票据编号:
@foreach(BillItemFragments中的变量项)
{
@项目;
}
拯救
AddBillComponent.razor.cs
protected NewBillHeaderVM NewBillHeaderVM { get; set; }
protected EditContext EditContext { get; set; }
protected List<RenderFragment> BillItemFragments{ get; set; }
public async Task ShowDialog()
{
NewBillHeaderVM = new NewBillHeaderVM
{
BillItemTypes = TypeService.Get();
NewBillItemVMs = new List<NewBillItemVM>()
}
BillItemFragments = new List<BillItemFragment> {
CreateDynamicFragment();
}
EditContext = new EditContext(NewBillHeaderVM);
await InokeAsync(StateHasChanged);
}
RenderFrafment CreateDynamicFragment() => builder =>
{
var newBillItemVM = new NewBillItemVM();
NewBillHeaderVM.NewBillItemVMs.Add(newBillItemVM);
builder.OpenComponent(0, typeof(BillItemFragment);
builder.AddAttribute(1, NewBillHeaderVM.BillItemTypes);
builder.AddAttribute(2, "NewBillItemVM", newBillItemVM);
builde.CloseComponent();
}
protectednewbillheadervm-NewBillHeaderVM{get;set;}
受保护的EditContext EditContext{get;set;}
受保护列表BillItemFragments{get;set;}
公共异步任务ShowDialog()
{
NewBillHeaderVM=新NewBillHeaderVM
{
BillItemTypes=TypeService.Get();
NewBillItemVMs=新列表()
}
BillItemFragments=新列表{
CreateDynamicFragment();
}
EditContext=新的EditContext(NewBillHeaderVM);
等待InokeAsync(statehaschange);
}
RenderFrafment CreateDynamicFragment()=>builder=>
{
var newBillItemVM=new newBillItemVM();
NewBillHeaderVM.NewBillItemVMs.Add(newBillItemVM);
OpenComponent(0,typeof(BillItemFragment);
builder.AddAttribute(1,NewBillHeaderVM.BillItemTypes);
builder.AddAttribute(2,“NewBillItemVM”,NewBillItemVM);
builde.CloseComponent();
}
BillItemFragment.razor
<EditForm EditContext="@EditContext" OnSubmit="@HandleSubmit">
<DataAnnotationsValidator />
<label for="BillNumber">Bill number:</label>
<InputText @bind-Value="NewBillHeaderVM.BillNumber" />
<ValidationMessage For="@(() => NewBillHeaderVM.BillNumber" />
@foreach(var item in BillItemFragments)
{
@item;
}
<button type="submit">Save</button>
</EditForm>
<div>
<label for="NewBillItemVM.SelectedBillItemTypeId>Type:</label>
<InputSelect id="NewBillItemVM.SelectedTypeId" @bind-Value="@NewBillItemVM.SelectedBillItemTypeId">
@foreach(vat opt in BillItemTypes)
{
<option value=@opt.Value>@opt.Text</option>
}
</InputSelect>
<ValidationMessage for="@(() => NewBillItemVM.SelectedBillItemTypeId)" />
<label for="NewBillItemVM.Number>Number:</label>
<InputNumber id="NewBillItemVM.Number" @bind-Value="@NewBillItemVM.Number" />
<ValidationMessage for="@(() => NewBillItemVM.Number)" />
</div>
@code {
[Parameter]
public List<BillItemType> BillItemTypes { get; set; }
[Parameter]
public NewBillItemVM NewBillItemVM { get; set; }
}
NewBillItemVM.SelectedBillItemTypeId)“/>
NewBillItemVM.Number)“/>
@代码{
[参数]
公共列表BillItemTypes{get;set;}
[参数]
公共NewBillItemVM NewBillItemVM{get;set;}
}
不幸的是,我不知道为什么字段验证仅对BillItemFragment的父组件的字段不起作用。
请
Thx我必须在NewBillHeaderVM视图模型的NewBillItemVMs端口上使用[ValidateComplexType]注释。我必须在NewBillHeaderVM视图模型的NewBillItemVMs端口上使用[ValidateComplexType]注释。