【问题标题】:Xamarin Community Toolkit input validation is true even when Entry is empty即使条目为空,Xamarin 社区工具包输入验证也为真
【发布时间】:2021-05-12 03:37:36
【问题描述】:

这是我的表单,其中包含邮件和电话两个条目以及发送按钮

<StackLayout HorizontalOptions="FillAndExpand" Orientation="Vertical" Grid.Row="0"  Margin="0,5,0,5">
    <Label>
        <Label.FormattedText>
            <FormattedString>
                <Span  FontSize="16" Text="Phone" TextColor="#07987f"></Span>
                <Span  FontSize="16" Text=": " TextColor="#07987f"></Span>
            </FormattedString>
        </Label.FormattedText>
    </Label>
    <Entry x:Name="entryPhone" Placeholder="Phone" Text="{Binding Phone}">
        <Entry.Behaviors>
            <xct:TextValidationBehavior x:Name="phoneValidationRule" Flags="ValidateOnUnfocusing" RegexPattern="^07[0-9]{7}$"/>
        </Entry.Behaviors>
    </Entry>
</StackLayout>

<StackLayout HorizontalOptions="FillAndExpand" Orientation="Vertical" Grid.Row="1" Margin="0,5,0,5">
    <Label>
        <Label.FormattedText>
            <FormattedString>
                <Span  FontSize="16" Text="E-mail" TextColor="#07987f"></Span>
                <Span  FontSize="16" Text=": " TextColor="#07987f"></Span>
            </FormattedString>
        </Label.FormattedText>
    </Label>
    <Entry x:Name="entryEmail" Placeholder="Email" Text="{Binding Email}">
        <Entry.Behaviors>
            <xct:EmailValidationBehavior x:Name="emailValidationRule"  Flags="ValidateOnUnfocusing"/>
        </Entry.Behaviors>
    </Entry>
</StackLayout>

<Button Text="SEND" Clicked="ValidationFormForRegistraitonClicked" TextColor="#07987f"  BackgroundColor="#eeeeee"  Margin="0,10,0,10"></Button>
<StackLayout>
    <Label IsVisible="{Binding IsValidMail}" Text="ENTER VALID EMAIL"></Label>
    <Label  IsVisible="{Binding IsValidPhone}" Text="ENTER VALID PHONE"></Label>
</StackLayout>

这是我的验证函数:

       private void ValidationFormForRegistraitonClicked(object sender, EventArgs e)
        {

                if (!emailValidationRule.IsValid)
                    viewModel.IsValidMail = true;
                else
                    viewModel.IsValidMail = false;
                if (!phoneValidationRule.IsValid)
                    viewModel.IsValidPhone = true;
                else
                    viewModel.IsValidPhone = false;              
        }

当条目为空且有效语句是错误的时,我遇到了问题。我有一个简单的要求。如果输入有效的地址和有效的电话通过它。如何解决这个问题?

【问题讨论】:

  • EmailValidation 和 TextValidation 有一个您可以使用的 MinimumLength 属性。或使用自定义正则表达式或将其包装在 MultiValidation 中并结合一些东西
  • 对于电话,您可以更改Flags="ValidateOnAttaching" 它应该可以工作,对于电子邮件@GeraldVersluis 提到了 3 种方法:)
  • @GeraldVersluis MinimumLenght=1 我添加但仍然无法正常工作。当我不输入 antyhing 时返回电话和电子邮件验证是真的

标签: c# xaml xamarin.forms xamarin-community-toolkit


【解决方案1】:

对于手机,您可以通过将 Flags 属性值更改为 "ValidateOnAttaching" 来更改应用行为的时间:

<Entry x:Name="entryPhone" Placeholder="Phone" Text="{Binding Phone}">
      <Entry.Behaviors>
           <xct:TextValidationBehavior x:Name="phoneValidationRule" Flags="ValidateOnAttaching" RegexPattern="^07[0-9]{7}$"/>
      </Entry.Behaviors>
</Entry>

对于电话,您可以使用 GeraldVersluis 在他的评论中提到的 MinimumLength

<Entry x:Name="entryEmail" Placeholder="Email" Text="{Binding Email}">
       <Entry.Behaviors>
             <xct:EmailValidationBehavior x:Name="emailValidationRule"  Flags="ValidateOnAttaching" MinimumLength="1"/>
        </Entry.Behaviors>
</Entry>

如果这在某些情况下还不够,并且您希望更多地控制“何时”进行验证,您可以调用 ForceValidate() 方法,例如在您的 ValidationFormForRegistraitonClicked() 事件处理程序中强制验证/重新评估,或者无论何时你认为有必要。

private void ValidationFormForRegistraitonClicked(object sender, EventArgs e)
{
            emailValidationRule.ForceValidate();
            phoneValidationRule.ForceValidate();

            if (!emailValidationRule.IsValid)
                 viewModel.IsValidMail = true;
            else
                viewModel.IsValidMail = false;
            if (!phoneValidationRule.IsValid)
                viewModel.IsValidPhone = true;
            else
                viewModel.IsValidPhone = false;              
}

【讨论】:

  • 首先谢谢你。其次,经过一整天的测试,我完成了这一点:你可以使用带有焦点和附件的标志进行实时可视化,但最后你必须检查ForceValidate(),因为如果你不这样做,有些情况会得到你错误的答案
  • 文档是否对此进行了解释?或演示ValidateOnAttaching 并有评论的示例?看到你的回答后,我可以谷歌并在 doc 中找到该标志,但你是如何得知这一点的?
  • @ToolmakerSteve 对于标志,我没有找到带有详细解释的明确文档,我想应该将其添加到 API docs,您可以在 this specific repo 上提出有关文档的问题,您可以还可以查看源代码并尝试了解每个标志的工作原理或通过官方 repo 上的 GitHub 讨论询问 repo 维护者和社区。​​span>
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 2021-10-12
  • 2021-09-21
  • 2022-01-22
  • 2021-10-08
  • 2016-01-01
  • 2021-05-06
  • 1970-01-01
相关资源
最近更新 更多