c# - 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> 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" />
}
}
解决方案
无法在 ASP.NET 中创建自定义客户端验证。只有像这样的内置函数[Required]
可用。您可以尝试使用 javascript 绕过它。
推荐阅读
- sql - 将日期标准化为从同一来源开始的期间
- php - Laravel Jetstream - 导航 - 将路线名称数据传递给:活动导航
- c# - AutoMapper ForPath - 路径中有集合
- java - 如何在Java中找到具有负增量以及正负值的随机值?
- docker - 是否有任何可能的解决方案可以在 Jenkins 的帖子部分(声明性管道)下运行 docker?
- python - “groupby”返回每个分组项目的出现百分比
- python-3.x - Weasyprint 输出不显示大部分原始网页?
- javascript - 我无法理解这段代码中的 parseInt 方法
- c++ - 您可以在 if 语句中使用数字范围吗?
- flutter - 我在哪里可以获得 VSCode 中 dart 启动的配置?