首页 > 解决方案 > ASP.NET Core MVC 自定义验证被忽略

问题描述

验证:

public class MustContainTags : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var msg = (Message)validationContext.ObjectInstance;

            if (msg.Text == null)
                return new ValidationResult("This field is required.");

            var text = msg.Text;
            if (Regex.Matches(text, @"($\w+)").Count == 0)
            {
                return new ValidationResult("Message must contain at least one tag.");
            }
            else
            {
                return ValidationResult.Success;
            }
        }
    }

模型:

public class Message
    {
        ...
        [BsonElement("msg_text")]
        [Required(ErrorMessage = "This field is required.")]
        [Display(Name = "Message")]
        [MinLength(32, ErrorMessage = "Must contain at least 32 characters.")]
        [MaxLength(256, ErrorMessage = "Must contain no more than 256 characters.")]
        [MustContainTags(ErrorMessage = "Message must contain at least one tag.")]
        public string Text { get; set; }

    }

控制器:

[HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult PostMessage(Message model)
        {
            if (ModelState.IsValid)
            {
                 //do things and redirect
            }
            return View(model);
        }

技术上看起来不错,它应该可以工作。除非它没有。

内置验证按预期工作。当出现错误时,输入下方会出现红色文本,并通知用户出现问题。

当除 之外的所有约束都满足[MustContainTags]时,没有错误消息,并且ModelState.IsValid = false,它将我们重定向到查看,而不是通知用户出了什么问题。

编辑

看法:

<form method="post" asp-action="NewMessage">
    <div class="border p-3">
        @*<div asp-validation-summary="ModelOnly" class="text-danger"></div>*@
        <div class="form-group row">
            <h2 class="text-info pl-3">Write new post</h2>
        </div>
        <div class="form-group row">
            <label asp-for="Message.Title" class="ml-2"></label>
            <input asp-for="Message.Title" class="form-control" />
            <span asp-validation-for="Message.Title" class="text-danger"></span>
        </div>
        <div class="form-group row">
            <label asp-for="Message.Text" class="ml-2"></label>
            <textarea asp-for="Message.Text" class="form-control" rows="6"></textarea>
            <span asp-validation-for="Message.Text" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group row">
        <div class="col-8 offset-2 row">
            <div class="col">
                <button type="submit" class="btn btn-info w-100"><i class="fas fa-plus"></i>&nbsp;Post message</button>
            </div>
            <div class="col">
                <a asp-action="Index" class="btn btn-success w-100"><i class="fas fa-sign-out-alt"></i> Back</a>
            </div>
        </div>
    </div>
</form>

@section Scripts{
    @{
        <partial name="_ValidationScriptsPartial" />
    }
}

标签: c#asp.net.net-core

解决方案


无法在 ASP.NET 中创建自定义客户端验证。只有像这样的内置函数[Required]可用。您可以尝试使用 javascript 绕过它。


推荐阅读