【问题标题】:OnvalidSubmit fires and EditContext.Validate() returns true even though my model is intentionally invalid即使我的模型故意无效,OnvalidSubmit 也会触发并且 EditContext.Validate() 返回 true
【发布时间】:2022-11-02 02:42:58
【问题描述】:

在我的 Blazor Server App 项目中,我有一个 EditForm,其中包括我的 EditContext 和 OnValidSubmit 方法。

<EditForm EditContext="@EditContext" OnValidSubmit="@UpdateProject"> 我声明并初始化我的 EditContext 如下:

private EditContext EditContext;

    protected override async Task OnInitializedAsync()
    {
        EditContext = new(supplementedProjectModel);
    }

和我的模型:

    SupplementedProjectModel supplementedProjectModel = new();

当我使用提交按钮提交模型时

        <button type="submit" class="btn button-primary">Spara</button>

它会触发 OnValidSubmit 事件,即使我的模型在我的模型包含的空输入中故意无效

[Required]

属性。为什么?

我的第二个问题是在 OnValidSubmit 方法中,EditContext.Validate() 总是返回 true。这是为什么?

protected async Task UpdateProject()
    {
bool IsValid = EditContext.Validate();
        EditContext = new(supplementedProjectModel);
        bool isreallyvalid = EditContext.Validate();
        if (IsValid)
        {
// UPDATE MODEL
}
}

我已经尝试了所有这些注释验证器,并且在我运行项目并输入无效数据时清楚地看到了我的错误。

@*<ObjectGraphDataAnnotationsValidator />*@
    <DataAnnotationsValidator />
    <ValidationSummary />

在我的 UpdateProject 方法中,我的 EditContext 是否应该填充当前模型值?我会假设是这样,但找不到任何东西,因此我在再次初始化之前和之后测试了 Validate 方法。

谢谢阅读!

【问题讨论】:

    标签: c# blazor


    【解决方案1】:

    它会触发 OnValidSubmit 事件,即使我的模型故意无效,我的模型包含的输入为空......

    那是因为它是有效的。你可能不相信,但确实如此。

    您尚未向我们展示您尝试验证的模型,这对于回答问题至关重要。你的领域是原语吗?

    这是一个测试页面,它使用[Required] 工作的模型演示了 EditForm 和 Validation 的实际应用。笔记:

    • Name? 无效 - 它是一个字符串,可以为空。
    • Value 是一个默认值为 0 的 int - 因此有一个值并且是有效的。
    @page "/"
    @using System.ComponentModel.DataAnnotations;
    
    <PageTitle>Index</PageTitle>
    
    <EditForm EditContext=this.editContext OnValidSubmit=this.OnValidSubmit OnInvalidSubmit=this.OnInValidSubmit  >
        <DataAnnotationsValidator/>
        <div class="p-2 mb-3">Normal edit fields here</div>
        <div class="mb-3">
            <button class="btn btn-primary" type="submit">Submit</button>
        </div>
        <ValidationSummary />
    </EditForm>
    
    <div class="bg-dark text-white m-2 p-2">
        <div>Name: @model.Name</div>
        <div>Value: @model.Value</div>
    </div>
    
    @if (this.message != string.Empty)
    {
        <div class="alert alert-info">
            @message
        </div>
    }
    
    @code {
        private MyModelData model = new();
        private EditContext? editContext;
        private string message = string.Empty;
    
        public void OnValidSubmit()
        {
            this.message = "Valid Submit";
        }
    
        public void OnInValidSubmit()
        {
            this.message = "InValid Submit";
        }
    
        protected override void OnInitialized()
        {
            this.editContext = new EditContext(model);
        }
    
        public class MyModelData 
        {
            [Required]
            public string? Name { get; set; }
    
            [Required]
            public int Value { get; set; }
        }
    }
    

    【讨论】:

      【解决方案2】:

      这里不进行验证...要进行验证,您必须在代码中嵌入 DataAnnotationsValidator 组件,如下所示:

      <EditForm EditContext="@EditContext" OnValidSubmit="@UpdateProject">
          <DataAnnotationsValidator />
      

      您可以添加ValidationSummary 以显示错误摘要。您还可以在每个字段下添加验证消息。

      注意:您的代码格式不正确...

      这个:

      protected override async Task OnInitializedAsync()
          {
              EditContext = new(supplementedProjectModel);
          }
      

      应该:

      protected override void OnInitialized()
              {
      
                  _supplementedProjectModel = new SupplementedProjectModel();
                  EditContext = new(_supplementedProjectModel);
              } 
      

      如果您使用async Task,,您应该等待您的方法。

      【讨论】:

        猜你喜欢
        • 2020-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-31
        • 2012-01-14
        • 2011-04-25
        • 1970-01-01
        相关资源
        最近更新 更多