首页 > 解决方案 > 数组的 ASP.NET Core 3 MVC 自定义客户端验证

问题描述

我有点奇怪。我需要对字符串数组执行客户端验证,但我不知道如何。服务器端验证工作得很好,但每个人<input>都没有data-val我设置的那个。有谁知道如何解决这个问题?

模型

[RequiredIf]
public string[] PaperQuantity {get;set;}

看法

<input asp-for="PaperQuantity[count]">

自定义验证

public class RequiredIfAttribute : ValidationAttribute, IClientModelValidator
{
  protected override ValidationResult IsValid(object value, ValidationContext validationContext)
  {
    // Validation method here
  }
  public void AddValidation(ClientModelValidationContext context)
  {
    MergeAttribute(context.Attributes, "data-val", "true");
    MergeAttribute(context.Attributes, "data-val-requiredif", ErrorMessage);
  }
}

JavaScript

$.validator.addMethod("requiredif", function () {
  // Validation method here
});
$.validator.unobtrusive.adapters.addBool("requiredif");

标签: asp.net-coremodel-view-controllerasp.net-core-mvcasp.net-core-3.1

解决方案


我建议您对这些情况使用远程验证。您可以使用 DbContext 中的可选数据验证您想要的任何内容,它会自动暗示使用jQuery Unobtrusive.

例子

使用 [Remote] 属性注释属性

[Remote(action: "VerifyPaper", controller: "MyControler")]
public string PaperQuantity {get; set;}

例如,由于 jQuery 期望 JSON 响应Verify paper,您的控制器中的方法应该是这样的:

[AcceptVerbs("GET", "POST")]
public IActionResult VerifyPaper(string paperQuantity)
{
    if (string.Empty(paperQuantity))
    {
        // Your error message
        return Json("Paper quantity can't be empty.");
    }
    // If everything is okay return true
    return Json(true);
}

你的观点应该是这样的:

<label asp-for="PaperQuantity">Paper quantity</label>
<input asp-for="PaperQuantity"/>
<span asp-validation-for="PaperQuantity"></span> 

您可以在此处阅读有关远程验证的更多信息。


推荐阅读