C# 如何使用Blazor中的DataAnnotationsValidator验证两个字段是否匹配?

C# 如何使用Blazor中的DataAnnotationsValidator验证两个字段是否匹配?,c#,asp.net-core,blazor,C#,Asp.net Core,Blazor,我对开发相当陌生,并试图用Blazor学习C#development。我目前正在学习如何使用EditForms构建表单,以及如何使用DataAnnotationsValidator进行验证 在开始处理表单之前,我已经成功地完成了验证所需的大部分工作,但是,我在验证的一个重要方面遇到了问题:我正在处理的表单是新用户的注册表单。通常,在注册新用户时,您可能希望让用户重新输入一个值,如电子邮件地址或密码,以确保他们键入的值正确: <InputText @bind-Value=User.e

我对开发相当陌生,并试图用Blazor学习C#development。我目前正在学习如何使用
EditForms
构建表单,以及如何使用
DataAnnotationsValidator
进行验证

在开始处理表单之前,我已经成功地完成了验证所需的大部分工作,但是,我在验证的一个重要方面遇到了问题:我正在处理的表单是新用户的注册表单。通常,在注册新用户时,您可能希望让用户重新输入一个值,如电子邮件地址或密码,以确保他们键入的值正确:

    <InputText @bind-Value=User.email id="email" /><br />
    <ValidationMessage For=@( () => User.email) />
    <label for="confirm">Confirm Email</label><br />
    <InputText @bind-Value=User.confirm id="confirm"/><br />
在Microsoft的
DataAnnotationsValidator
文档中,我发现了一个类
CompareAttribute
,根据文档,它“提供了一个比较两个属性的属性”。我相信这可以满足我的需要,但我在使用它时遇到了问题
Compare
接受参数
otherProperty
,我认为这将是我试图匹配的其他用户输入,但是,我不知道如何将以前的输入作为此参数传递

我尝试了
电子邮件,
但是,需要对象引用。我似乎不想在类本身中引用该类的实例,因此我尝试了
此。电子邮件
但出现错误“关键字“this”在当前上下文中不可用。”


如果有人能在我的情况下帮助我找到使用
Compare
类的正确方法,我将不胜感激。否则,如果我找错了树,请告诉我。谢谢

我的问题在stackoverflow.com/a/13237249/842935的帖子中得到了回答(感谢Dani Herrera指出这一点)

参数是一个字符串,表示要与之进行比较的属性的名称。因此,以下代码将完成我试图完成的任务:

[Compare("email", ErrorMessage = "The email addresses you entered did not match.")]

对于Blazor应用程序,Microsoft创建了新的NuGet软件包,用于DataAnnotationsValidator组件。此库在与其直接替换的前
[Compare]
属性相同的命名空间中定义属性
[CompareProperty]

工作示例:

@使用System.ComponentModel.DataAnnotations;
电邮:
确认:
提交
@代码{
私有用户_User=新用户();
私人无效手册提交()
{
Console.WriteLine(“OnValidSubmit”);
}
公共类用户
{
[必需]
[电邮地址]
公共字符串电子邮件{get;set;}
[必需]
[比较属性(“电子邮件”)]
公共字符串确认邮件{get;set;}
}
}

您可以阅读更多关于Blazor应用程序不需要使用
[Compare]
属性的原因。

Dup@daniherrera你联系的问题确实回答了我的问题。谢谢@daniherrera不是复制品。链接答案比Blazor早很多年,并且不能很好地使用它。请看下面我的评论。嗨@Xeevis,我没有投票关闭,只是问了一下。我给你重新投票。顺便说一句,把你的评论作为回答是个好主意。这不是一个正确的答案。CompareAttribute不能很好地与DataAnnotationsValidator组件一起工作,因为它没有将验证结果与特定成员关联。这可能导致字段级验证与提交时验证整个模型之间的行为不一致。在Blazor应用程序中,最好使用[CompareProperty],它直接替换[Compare]属性。它可以在实验性NuGet包Microsoft.AspNetCore.Components.DataAnnotations.Validation中找到,感谢您指出这一点。如果你把它作为一个例子来回答,我会接受的。不管怎样,谢谢你的帮助。我是从谷歌来的,所以值得一提的是——最好使用
nameof(Email)
作为
CompareProperty
构造函数的参数,因为它更能抵抗重构。
[Compare("email", ErrorMessage = "The email addresses you entered did not match.")]