首页 > 解决方案 > 如何找出 Blazor EditContext 中哪些属性存在验证错误?

问题描述

我有一个EditForm, 并且遇到了一些问题,因为某些东西导致了验证错误,但不是绑定到表单上的控件的东西。

为了澄清,我有一个表格模型(为了清楚起见,删除了一些属性)......

public class RenewalViewModel {
    public int CurrentTermId { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public ObservableCollection<CompanyOverview> AvailableCompanies { get; set; }
}

CurrentTermId未显示在表单上,​​但在提交表单时用于标识术语。Start,End一些省略的属性显示在表单上,​​用户可以编辑,ad 是保存数据时使用的。

除此之外,还有一些属性,例如AvailableCompanies保存验证所需的数据,但在提交表单时不使用。我需要在模型上使用它们,以便验证器可以看到它们(我正在使用FluentValidation)。

我怀疑,但不确定,不知何故,这些关联的属性之一(例如 aCompanyOverview或与之关联的东西)已被更改,并且处于无效状态。但是,我不知道如何找出哪个对象的哪个属性导致了验证错误,以便找出它发生的原因。

为了尝试弄清楚发生了什么,我将表单的提交处理程序更改为如下所示...

    private void OnSubmitRenew(EditContext ec) {
      if (ec.ValidateObjectTree()) {
        // Save the data
      } else {
        Debug.WriteLine("Invalid data: " + string.Join(". ", ec.GetValidationMessages()));
      }
    }

问题是这仅显示验证错误,而不是导致它们的属性。

有没有办法找出哪些属性导致了错误?我看了一下EditContext,但在那里看不到任何有用的东西。

谢谢

标签: blazor

解决方案


因为某些东西导致了验证错误

你怎么知道的 ?你被通知了吗?如果是这样,通知消息是什么?

验证错误通常采用以下形式:名字是必需的……BirthofDate 是必需的……等等。所以大多数时候我们都知道出了什么问题。

我建议您尝试使用此代码来定位错误的来源:

@code
    {
        private EditContext EditContext;
        private RenewalViewModel Model = new RenewalViewModel();
     
        protected override void OnInitialized()
        {
            EditContext = new EditContext(Model);
            EditContext.OnFieldChanged += EditContext_OnFieldChanged;

            base.OnInitialized();
        }

          // Note: The OnFieldChanged event is raised for each field in the model
        private void EditContext_OnFieldChanged(object sender, 
                                                FieldChangedEventArgs e)
        {
            

           // Each time a field changes this code is executed. 
              EditContext.Validate() returns true if
            // validation succeeded; that is, all fields pass validation
            if (EditContext.Validate())
            {
                Console.WriteLine("Validation succeeded");
            }
            else
            {
                // This is the culprit
                Console.WriteLine(e.FieldIdentifier.FieldName);
            }

        }
}

推荐阅读