Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 自定义数据批注未在回发时显示错误-ASP.NET core MVC6_Asp.net Mvc_Validation_Asp.net Core Mvc_Data Annotations - Fatal编程技术网

Asp.net mvc 自定义数据批注未在回发时显示错误-ASP.NET core MVC6

Asp.net mvc 自定义数据批注未在回发时显示错误-ASP.NET core MVC6,asp.net-mvc,validation,asp.net-core-mvc,data-annotations,Asp.net Mvc,Validation,Asp.net Core Mvc,Data Annotations,我已经看了很多关于这个主题的文章——自定义服务器端验证——和(我相信这是针对MVC4的),但似乎没有一篇对我来说能解决这个问题 我创建了一个基本的MVC6项目(两个文本框),只是为了测试dataannotations,但仍然无法实现。我正在使用它作为基础,并在没有任何更改的情况下重新创建了他的数据验证类 我使用的不是实际的模型,而是一个viewModel,如果验证成功,它将通过分配给模型来更新数据库 我对这里的成功验证不感兴趣,但如果“(ModelState.IsValid)”等于“False”

我已经看了很多关于这个主题的文章——自定义服务器端验证——和(我相信这是针对MVC4的),但似乎没有一篇对我来说能解决这个问题

我创建了一个基本的MVC6项目(两个文本框),只是为了测试dataannotations,但仍然无法实现。我正在使用它作为基础,并在没有任何更改的情况下重新创建了他的数据验证类

我使用的不是实际的模型,而是一个viewModel,如果验证成功,它将通过分配给模型来更新数据库

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

我已经仔细检查了它,发现它确实检查了实际的自定义验证器,并且它在自定义验证中给出了一个false的模型状态-返回视图-但是没有显示错误消息

但是,如果我从文本框中删除了所有内容(使其为空),则返回viewmodel,但这次返回的是红色的“必需”错误。。也就是说,错误消息只适用于数据注释,而不适用于自定义注释

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

这是ASP.NET core的结果还是我返回viewmodel的方式(例如,我更可能出错)

我已决定包括所有的运动部件,因为可能是其中任何一个不正确或有争议。这是一个模型,一个基于模型的视图模型,一个控制器和自定义验证器类,如教程所示

    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; }
}
控制器: 公共类CompanyDetailsController:控制器 { 私有应用程序的bContext\u上下文

    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);
    }

}
具有(普通脚手架)形式的视图-它使用viewmodel作为模型:

<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>

CompanyDetailsViewModel公司

以及实际的自定义验证类:

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;
    }
}
公共类ExcludeChar:ValidationAttribute
{
私有只读字符串\u字符;
公共ExcludeChar(字符串字符)
:base({0}包含无效字符。“)
{
_chars=chars;
}
受保护的重写ValidationResult有效(对象值,ValidationContext ValidationContext)
{
if(值!=null)
{
对于(int i=0;i<_chars.Length;i++)
{
var valueAsString=value.ToString();
if(valueAsString.Contains(_chars[i]))
{
var errorMessage=FormatErrorMessage(validationContext.DisplayName);
返回新的ValidationResult(errorMessage);
}
}
}
返回ValidationResult.Success;
}
}

您需要做的是在视图中指定要显示自定义错误消息的位置

例如:

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

我同意这是一个令人惊讶的行为。我似乎认为自定义错误的处理方式有所不同。可能是一些没有记录的命名约定。

我在您使用的代码中找到了它

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

这是VisualStudio生成的默认html(不知道为什么)。您需要添加结束标记

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


它将在字段下方显示错误消息。

如果我将视图cshtml中的“”更改为“ValidationSummary.All”,则错误消息仅显示在页面顶部,而不显示在文本框下。如果我清除文本框,则显示“requred”错误显示在两个地方…出于某种原因,自定义验证仅显示摘要,并且只有当其设置为“全部”时,MVC6才存在此功能?您不使用内置html帮助程序的具体原因是什么?假设它应该是“结果”呢?
<span asp-validation-for="number" class="text-danger" ></span>