C# 自定义ValidationAttribute ErrorMessage未按预期工作

C# 自定义ValidationAttribute ErrorMessage未按预期工作,c#,viewmodel,modelstate,validationattribute,C#,Viewmodel,Modelstate,Validationattribute,我建立了一个简单的日期检查来验证表单中的日期是否小于当前日期 验证属性 视图模型 HTML 它自身的验证工作正常,但错误消息不会显示。ViewModel中的所有其他错误消息都有效。他们使用默认的ValidationAttribute。我假设默认的ValidationAttribute类在其IsValid方法中使用ErrorMessage属性执行某些操作。在您的例子中,您没有在IsValid方法中对该属性进行任何处理,因此ErrorMessage属性不会发生任何变化 检查是否可以重写返回Val

我建立了一个简单的日期检查来验证表单中的日期是否小于当前日期

验证属性

视图模型

HTML



它自身的验证工作正常,但错误消息不会显示。ViewModel中的所有其他错误消息都有效。他们使用默认的ValidationAttribute。

我假设默认的ValidationAttribute类在其IsValid方法中使用ErrorMessage属性执行某些操作。在您的例子中,您没有在IsValid方法中对该属性进行任何处理,因此ErrorMessage属性不会发生任何变化


检查是否可以重写返回ValidationResult的IsValid方法,您可以将errormessage作为参数发送到其中。如果计算成功,您可以返回ValidationResult.Success或任何您想要的结果。

我重新编写并更新了代码。所以现在它应该使用给定的错误消息。但仍然没有运气。我只是尝试使用上面的代码复制这个,但它按预期工作。我看到的是“Prenumeren måset ha ett startdatum”或“Ogiltigt datum”。这取决于我是否像您的示例中那样设置了
DateNotValidErrorMessage
。您的自定义属性不支持客户端验证:可能与此有关吗?可能是自定义属性不支持客户端验证。但我有点困惑,因为一些例子只显示了我对上述代码所做的工作,然后它就应该可以工作了。它确实存在,但不存在错误消息。读了你的文章后,我发现:从那篇文章中,我推断我必须实现我想要的客户端规则。我走对了吗?您是如何让它工作的?唯一真正的区别是我在示例项目中禁用了客户端验证(我刚刚删除了脚本标记)。从理论上讲,即使启用了客户端验证,服务器端验证本身也应该可以工作,因此这可能不是您的问题,但这是唯一真正的区别。你可能想考虑创建一个。我也会这么做……不幸的是。我们决定在这种情况下不需要自定义验证。
public class DateIsValidAttribute : ValidationAttribute
{
    private const string DefaultErrorMessage = "Datumet är ogiltigt";
    public string DateNotValidErrorMessage { get; set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {

        DateTime? d = Convert.ToDateTime(value);

        if (d > DateTime.Now)
        {
            return ValidationResult.Success;
        }

        return new ValidationResult(DateNotValidErrorMessage ?? DefaultErrorMessage);
    }

}
[Required(ErrorMessage = "Prenumerationen måset ha ett startdatum")]
[Display(Name = "Startdatum")]
[DateIsValid(DateNotValidErrorMessage = "Ogiltigt datum.")]
public DateTime? StartDate { get; set; }
<div class="form-group">
<label asp-for="StartDate"></label>
<input type="text" asp-for="StartDate" class="form-control" id="startDate" />
<span asp-validation-for="StartDate" class="text-danger"></span>
</div>