Validation 如何将动态表单字段添加到EditContext以在Blazor服务器应用程序中进行验证

Validation 如何将动态表单字段添加到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

我将RenderFragment添加到包含InputSelect和InputNumber字段的EditForm中。 它正在工作,但他们的验证不起作用。我想我应该在EditContext中添加,但我不知道如何添加。我试着在网上查找,但它们对我来说还很复杂。 添加BillComponent.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; }
}

票据编号:
@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]注释。