剃刀页面的流利验证

时间:2020-04-27 07:00:19

标签: asp.net-core razor error-handling razor-pages fluentvalidation

基于此page,我试图制作一个使用流利验证的剃刀页面。它似乎已经检查了,但是我不确定为什么不会显示错误消息。

这是我到目前为止所做的:

cshtml.cs:

CreateCommandValidator CreateValidator = new CreateCommandValidator();
var createCheck = CreateValidator.Validate(NewItem);
foreach (ValidationFailure fail in createCheck.Errors)
{
     ModelState.AddModelError(fail.PropertyName, fail.ErrorMessage);
}
return Page();

cshtml:

<label class="col-form-label">Name</label>
<input asp-for="NewItem.Name" type="text" class="form-control mb-2"/>
<span asp-validation-for="NewItem.Name" class="text-danger"></span>

CreateCommandValidator:

RuleFor
     (Item => Item.Name)
     .NotEmpty().WithMessage("The name cannot be empty")
     .Length(1, 100);

ValidationFailure能够检测到错误消息,但不确定为什么它不会在页面上显示。有什么想法吗?预先感谢!

2 个答案:

答案 0 :(得分:0)

如果还没有脚本,则需要使用脚本来进行无干扰的验证。

示例

查看(cshtml):

@{
    ViewData["Title"] = "Log in";
}
<section>
    <div class="container">

    </div>
</section>


@section Scripts {
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js"
            crossorigin="anonymous"
            integrity="sha256-F6h55Qw6sweK+t7SiOJX+2bpSAa3b/fnlrVCJvmEj1A=">
    </script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"
            crossorigin="anonymous"
            integrity="sha256-9GycpJnliUjJDVDqP0UEu/bsm9U+3dnQUH8+3W10vkY=">
    </script>
}

共享布局(_Layout.cshtml)应具有脚本部分

 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />


 </head>
<body>
    <div class="main-container">
        @RenderBody()
    </div>



    @RenderSection("Scripts", required: false)


</body>
</html>

答案 1 :(得分:0)

ValidationFailure能够检测到错误消息,但不能确定 为什么它不会显示在页面上。有什么想法吗?

这是因为您的data-valmsg-for的键名是NewItem.Name

您的cshtml文件如下:

<span asp-validation-for="NewItem.Name" class="text-danger"></span>

将在浏览器中生成如下所示的html:

<span data-valmsg-for="NewItem.Name" class="text-danger field-validation-valid" data-valmsg-replace="true"></span>

1。第一种方法,您可以如下更改密钥名称:

ModelState.AddModelError("NewItem.Name", fail.ErrorMessage);

2。第二种方法,如果您不想手动添加密钥名称,则可以安装FluentValidation.AspNetCore软件包并按如下所示更改代码:

CreateCommandValidator CreateValidator = new CreateCommandValidator();
var createCheck = CreateValidator.Validate(NewItem);

//AddToModelState(ModelStateDictionary modelState, string prefix);
createCheck.AddToModelState(ModelState, "NewItem");

return Page();