Asp.net mvc 自定义验证程序未显示错误消息

Asp.net mvc 自定义验证程序未显示错误消息,asp.net-mvc,asp.net-mvc-3,customvalidator,Asp.net Mvc,Asp.net Mvc 3,Customvalidator,在我的ASP.net MVC3应用程序的域模型上,我构建了一个自定义验证器,以确保以特定格式插入出生日期 我将出生日期保存为字符串,因为我的应用程序需要保存长期死亡的人的出生日期,例如柏拉图、苏格拉底等,以防您想知道为什么不使用DateTime保存出生日期 以下是我的自定义验证程序代码: [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public sealed class

在我的ASP.net MVC3应用程序的域模型上,我构建了一个自定义验证器,以确保以特定格式插入出生日期

我将出生日期保存为字符串,因为我的应用程序需要保存长期死亡的人的出生日期,例如柏拉图、苏格拉底等,以防您想知道为什么不使用DateTime保存出生日期

以下是我的自定义验证程序代码:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class ValidateDODDOB : ValidationAttribute
{
    // Error Message
    private const string DefaultErrorMessage = "Please type the date in the format specified.";

    // Gets or sets the Regular expression.
    private Regex Regex { get; set; }        

    // The pattern used for Date of Birth and Date of Death validation.
    public string Pattern { get { return @"^(?:\d+\s)?(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)?(?:\s?\d+)(?:\sBCE)?$"; } }

    // Initializes a new instance of the VerifyDODDOB class.
    public ValidateDODDOB() : base(DefaultErrorMessage)
    {
        this.Regex = new Regex(this.Pattern);
    }

    // Determines whether the specified value of the object is valid.
    // true if the specified value is valid; otherwise, false.
    public override bool IsValid(object value)
    {
        // convert the value to a string
        var stringValue = Convert.ToString(value);

        var m = Regex.Match(stringValue);

        return m.Success;
    }
}
上述操作用于验证和停止数据库中的创建/编辑操作。但是当表单返回到视图时,不会显示任何错误消息

针对评论01的更新:

对不起,奥利弗,我也应该发布查看代码。这是:

<div class="inputField">
    @Html.LabelFor(x => x.DOB, "Date of Birth")
    @Html.TextBoxFor(model => model.DOB)
    @Html.ValidationMessageFor(model => model.DOB)
</div>

是的,我已经告诉它也要显示验证消息。就AJAX而言,它不是通过AJAX实现的。正如您所说,它是在完整的POST请求之后发出的。

您的意思是希望消息显示在ValidationSummary控件中吗

如果是,请尝试将ValidationSummary HtmlHelper的excludePropertyErrors设置为false:

@Html.ValidationSummary(false)

这将告诉summary控件summary display all errors(汇总显示所有错误),并将其设置为“true”(默认值),这将告诉该控件仅显示模型级错误。

我认为您可能希望使用此方法

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

    // convert the value to a string
    var stringValue = Convert.ToString(value);

    var m = Regex.Match(stringValue);

    if(!m.Success)
    {
        return new ValidationResult(DefaultErrorMessage);
    }
    return null;
}

然后在视图中确保您具有ValidationMessageFor,并在控制器中确保选中ModelState.IsValid,如果原始视图无效,则返回原始视图。应该这样做。

您的视图代码是否使用@Html.ValidationMessageForm=>m.propertyWithValidatedDoddobattribute?你能发布你的查看代码吗?另外,您的创建/编辑操作是否通过AJAX访问?或者验证消息在完整POST请求后未显示?您是否也可以发布控制器和型号?可能是一些小问题,例如没有在模型中用validatedDob属性注释DOB,或者在控制器中缺少ModelState.IsValid等。这当然也有助于发布它们。下面是在控制器中处理HttpPost请求的说明。至于模型,它位于一个外部项目中,并且看起来很像。谢谢,我刚刚用上面的代码尝试过,但我得到了错误:[在重写'public'继承成员'System.ComponentModel.DataAnnotations.ValidationAttribute.IsValidobject]时无法更改访问修饰符]!!哎呀,忘了ValidationContext,现在试试。。。如果这不起作用,尝试切换到Public保护谢谢我尝试了你修改过的代码,它编译得很好,但是验证的错误消息再次没有显示:你是否只尝试了[RegularExpression@^?:\d+\s?一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月:\s?\d+?:\sBCE?$]属性?你有jQuery验证文件吗?