【问题标题】:HowTo Refresh green outlines of DataAnnotationsValidator after submit提交后如何刷新 DataAnnotationsValidator 的绿色轮廓
【发布时间】:2020-09-09 11:37:32
【问题描述】:

提交表单后,如何删除 blazor 中输入字段的绿色轮廓? 提交成功后,输入修改字段仍为绿色轮廓。

在我的页面上,成功提交后可能会加载另一个数据集。 新数据已正确加载到输入字段中,但输入字段的边框仍为绿色,这是在之前的数据集中进行了修改。

我在 editForm 的 OnValidSubmit 处使用“StateHasChanged()”进行了尝试,但没有成功;

还有一个通过 onclick "StateHasChanged()" 触发的按钮也没有帮助。 在我看来,“StateHasChanged()”不会从 blazor 的输入字段中删除绿色边框。

并且不想用“navigateTo”或类似的东西重新加载整个 blazor bage。

【问题讨论】:

  • 您使用的是哪种输入?有图书馆吗?如果可能,请更清楚并分享一些代码

标签: c# blazor


【解决方案1】:

您好,欢迎来到社区!通常最好的做法是发布一个最小的可复制示例供社区使用,所以如果可以的话,请这样做。我会做一些假设,因为我想我知道发生了什么,你可以从中理解。如果是我认为的那样,则在提交有效表单后需要刷新表单的 EditContext。

假设你的表单有一个模型属性:

public FormModel Model { get; set; }

有两种方法可以将模型附加到<Editform ... > 组件。一种使用Model 参数,另一种使用EditContext 参数。我们将使用后者,因为它使我们能够控制代码块中的上下文。

所以你的剃须刀文件开始看起来像这样:


<EditForm EditContext="Context" OnValidSubmit="HandleValidSubmit" >

    ..... form body and submit button
</EditForm>

@code {

    public FormModel Model { get; set; } = new FormModel();

    public EditContext Context { get; set; }

    private void HandleValidSubmit()
    {
        //Whatever needs to be done on valid submit

        // Refresh the Editcontext
        Context = new EditContext(Model);

        // You may or may not need this call
        StateHasChanged();
    }

    protected override async Task OnInitializedAsync()
    {
        // Other initialization code, set your initial form model, etc. 

        // Set the form edit context with your model. 
        Context = new EditContext(Model);
    }
}

我们在初始化期间将 EditContext 设置为您要用于表单的模型,并且一切都应该正常工作。验证大纲从 EditContext 驱动,因此如果您在有效表单提交上提供新的编辑上下文,则大纲将消失。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    你的 HandleValidSubmit 方法应该是这样的:

    private void HandleValidSubmit()
    {
          EditContext.MarkAsUnmodified();
    }
    

    希望这行得通...

    【讨论】:

      【解决方案3】:

      感谢 enet 和 Nik, 您的两个答案的组合使它起作用。

      首先,我必须将 EditForm 的 EditContext 绑定到 Nik 所写的“Context”属性。 有效提交后,我调用了“MarkAsUnmodified”,如 enet 所写。:

      &lt;EditForm EditContext="Context" OnValidSubmit="@MyInsertMethodAsync"&gt;

      protected override async Task OnInitializedAsync()
      {
          Context = new EditContext(MyViewModel);
          await MyViewModel.InitializePropertiesAsync();
      }
      
      private async Task MyInsertMethodAsync()
      {
          await MyViewModel.InsertMyStuffAsync();
          Context.MarkAsUnmodified();
      }
      

      【讨论】:

      • 不,首先你必须创建一个 Blazor 项目...... ;)你有一个答案告诉你这样做:EditContext.MarkAsUnmodified();这行代码可以解决问题。答案不是您应该创建一个 EditContext 对象。这是不言而喻的,就像需要创建一个项目来运行此代码等一样。注意:有一种方法可以表达答案的有用性:可以通过单击复选图标(将其变为绿色)来接受它以及支持答案(点击向上箭头)
      猜你喜欢
      • 2019-03-15
      • 2021-11-28
      • 1970-01-01
      • 2018-03-18
      • 2010-10-26
      • 1970-01-01
      • 2020-06-27
      • 2023-03-22
      相关资源
      最近更新 更多