【问题标题】:Fluent Validation not Working in Bootstrap 4 Modal流利的验证在 Bootstrap 4 模式中不起作用
【发布时间】:2019-10-23 13:27:22
【问题描述】:

我在我的 Razor 页面上使用了数据注释验证,效果很好。对于更复杂的验证,我使用的是 Fluent Validation,它适用于所有情况,除非它在模态中。

    public class MyModel
{

    [RegularExpression(@"^Test|Prod", ErrorMessage = "Please Choose A Type")]
    public string Type { get; set; }

    }

public class MyValidator : MyValidator<MyModel>
{
    public MyValidator()
    {
        RuleFor(x => x.Username)
            .Empty()
            .When(support => x.Found == false)
            .WithMessage("Not Found");
        RuleFor(x => x.IsComplete)
            .Must(x => x.Equals(true))
            .WithMessage("Please confirm");
    }
}

以下是示例模式代码 - 我已对其进行了简化,如有任何错误,我深表歉意。主体中的代码验证良好,但我在 Fluent Validation 的模态中没有任何工作 - 它只是在没有检查的情况下提交。我有几个模态都在做同样的事情。数据注释验证工作正常。

<div id="" class="modal" tabindex="-1" role="dialog">    
    <div class="modal-dialog-700" role="document">
        <div class="modal-content modal-size">
            <div class="modal-header">
                <h6 class="modal-title">Test</h6>
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
            </div>
        <div class="modal-body">
            <div class="container">
                <div class="row justify-content-md-center">
                    <form asp-page-handler="update" method="post">
                        <div class="form-group">
                            <label asp-for="MyModel.Username" class="control-label">Test Code</label>
                            <textarea asp-for="MyModel.Username" class="form-control" rows="2"></textarea>
                            <span asp-validation-for="MyModel.Username" class="text-danger"></span>
                        </div>

                        <div class="form-group">
                            <button class="btn">
                                <span class="text">Update</span>
                            </button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>


@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

我也试过了:

        RuleFor(support => support.Found.ToString())
            .Matches(@"^True$")

【问题讨论】:

    标签: asp.net-core bootstrap-4 razor-pages fluentvalidation


    【解决方案1】:

    真正的原因是FluentValidation 确实支持客户端验证的所有规则。

    引用自FluentValidation docs

    请注意,并非所有在 FluentValidation 中定义的规则都适用于 ASP.NET 的客户端验证。例如,使用条件(使用 When/Unless)、自定义验证器或对 Must 的调用定义的任何规则都不会在客户端运行。 RuleSet 中也没有任何规则(尽管可以更改 - 请参阅下面的“客户端消息的规则集”部分)。客户端支持以下验证器:

    NotNull/NotEmpty
    Matches (regex)
    InclusiveBetween (range)
    CreditCard
    Email
    EqualTo (cross-property equality comparison)
    MaxLength
    MinLength
    Length
    

    所以这是一种设计行为。

    【讨论】:

    • 这是否意味着主体中使用的相同规则不应该起作用?
    • 我很困惑,因为我虽然上面是服务器端验证?
    • @Hawke "它只是在没有检查的情况下提交":浏览器提交表单时没有检查,因为"使用条件定义的任何规则(使用 When**/**Unless )、自定义验证器或对 Must 的调用将不会在客户端运行”。您需要检查服务器端的 ModelState 或创建自定义远程验证器。
    • 我只是对为什么这适用于页面上的所有其他表单而不是模式感到困惑。你是对的,它只是 .Must() 和 .When() 不起作用,所以我并不是说你错了。我尝试使用数据注释编写自定义验证器,但也没有运行 (jasonwatmore.com/post/2013/10/16/…)
    • @Hawke 您上面链接的教程仍在服务器端进行验证:如果验证失败,它会呈现带有验证消息的表单。请参阅“if(!ModelState.IsValid){ ... }”(第 17 行)
    【解决方案2】:

    FluentValidation 是一个服务器端框架,不直接提供任何客户端验证。客户端支持以下验证器:

    NotNull/NotEmpty
    Matches (regex)
    InclusiveBetween (range)
    CreditCard
    Email
    EqualTo (cross-property equality comparison)
    MaxLength
    MinLength
    Length
    

    如果你想在客户端使用验证规则,你可以试试 FormHelper。 Form Helper 将服务器端验证转换为客户端。

    Nuget 包:https://www.nuget.org/packages/FormHelper

    GitHub:https://github.com/sinanbozkus/formhelper

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      相关资源
      最近更新 更多