自定义数据注释在回发时不显示错误

我已经看了很多关于这个主题的帖子 - 自定义服务器端验证 - 在这里和这里和这里(我相信这是用于MVC4),但似乎没有人为我解决这个问题。

我创建了一个基本的MVC6项目(两个文本框)来测试数据注释,但仍然无法使其工作。 作为基础,我正在使用本教程,并且没有任何更改就重新创建了他的数据验证类。

我没有使用实际模型,而是使用viewModel,如果验证成功,则通过赋值给模型来更新数据库。

我对这里的成功验证不感兴趣,但是,在“(ModelState.IsValid)”等于“False”时,它是否在文本框下显示错误消息。

我已经通过它,发现它确实通过实际的自定义验证程序,它肯定给自定义验证上的模型状态为false - 返回视图 - 但不显示错误消息。

但是,如果我从文本框中删除所有内容 - 将其设置为空 - 将返回视图模型,但是这次它会以红色的“必需”错误出现。也就是说,错误消息适用于数据注释,而不是自定义注释。

那么为什么它显示正常的注释验证错误而不是自定义验证错误?

这是ASP.NET核心的结果还是只是我返回视图模型的方式(例如,我更可能是一个错误)?

我已决定包括所有运动部件,因为它们中的任何一个可能不正确或存在问题。 这就是模型,基于模型的视图模型,控制器和自定义校验器类。

    public class CompanyDetail
    {
         public int CompanyDetailId { get; set; }
         public string CompanyName { get; set; }
         public string ABN { get; set; }
    }

添加了数据注释的CompanyDetailViewModel:

 public class CompanyDetailsViewModel
{
    public int CompanyDetailsId { get; set; }

    [ExcludeChar("/")]
    [Required(ErrorMessage = "A Company Name is required")]
    [Display(Name = "Company Name:")]
    [StringLength(100)]
    public string CompanyName { get; set; }

    [Required(ErrorMessage = "An ABN is required")]
    [CheckValidABN(ErrorMessage = "This is not a valid ABN")]
    [Display(Name = "ABN:")]
    public string ABN { get; set; }
}

控制器:public class CompanyDetailsController:Controller {private ApplicationDbContext _context;

    public CompanyDetailsController(ApplicationDbContext context)
    {
        _context = context;    
    }


    // GET: CompanyDetailsViewModels/Edit/5
    public IActionResult Edit()
    {

        var Company = _context.CompanyDetails.First();
        if (Company == null)
        {
            return HttpNotFound();
        }
        var CompanyDetails = new CompanyDetailsViewModel();

        CompanyDetails.CompanyDetailsId = Company.CompanyDetailId;
        CompanyDetails.CompanyName = Company.CompanyName;
        CompanyDetails.ABN = Company.ABN;

        return View(CompanyDetails);
    }

    // POST: CompanyDetailsViewModels/Edit/5
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Edit(CompanyDetailsViewModel companyDetailsViewModel)
    {
        if (ModelState.IsValid)
        {
            CompanyDetail Company = _context.CompanyDetails.First();
            var CompanyDetails = new CompanyDetailsViewModel();

            Company.CompanyName = CompanyDetails.CompanyName;
            CompanyDetails.ABN = Company.ABN;

            _context.CompanyDetails.Update(Company);
            _context.SaveChanges();

            return RedirectToAction("Index");
        }
        return View(companyDetailsViewModel);
    }

}

带有(香草脚手架)形式的视图 - 它使用视图模型作为模型:

<form asp-action="Edit">
<div class="form-horizontal">
    <h4>CompanyDetailsViewModel</h4>
    <hr />
    <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div>
    <input type="hidden" asp-for="CompanyDetailsId" />
    <div class="form-group">
        <label asp-for="ABN" class="col-md-2 control-label"></label>
        <div class="col-md-10">
            <input asp-for="ABN" class="form-control" />
            <span asp-validation-for="ABN" class="text-danger" />
        </div>
    </div>
    <div class="form-group">
        <label asp-for="CompanyName" class="col-md-2 control-label"></label>
        <div class="col-md-10">
            <input asp-for="CompanyName" class="form-control" />
            <span asp-validation-for="CompanyName" class="text-danger" />
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div>
</div>

和实际的自定义验证类:

public class ExcludeChar : ValidationAttribute
{
    private readonly string _chars;
    public ExcludeChar(string chars)
    : base("{0} contains invalid character.")
    {
        _chars = chars;
    }


    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            for (int i = 0; i < _chars.Length; i++)
            {
                var valueAsString = value.ToString();
                if (valueAsString.Contains(_chars[i]))
                {
                    var errorMessage = FormatErrorMessage(validationContext.DisplayName);
                    return new ValidationResult(errorMessage);
                }
            }
        }
        return ValidationResult.Success;
    }
}

我在你使用的代码中弄明白了

<span asp-validation-for="number" class="text-danger" />

这是由Visual Studio生成的默认html(不知道为什么)。 您需要添加结束标记。 像使用它

<span asp-validation-for="number" class="text-danger" ></span>

它会在该字段下显示错误消息。


您必须做的是在视图中指定您希望显示自定义错误消息的位置。

例:

<div>
    @Html.ValidationMessage("CreditRating")
</div>

然后返回与“成员”CreditRating相关的ValidationResult将显示在该视图的该部分中。 成员在引号中,因为名称实际上可以是任何名称,不一定是真实的名称。

   results.Add(new ValidationResult("NO NO NO", new[] { "CreditRating" }));

我同意这是令人惊讶的行为。 我觉得自定义错误处理方式不同。 也许一些没有记录的命名约定。

链接地址: http://www.djcxy.com/p/56591.html

上一篇: Custom data annotations not displaying error on postback

下一篇: Which layer for model validation data annotations?