自定义验证器不显示错误消息

时间:2011-12-21 19:27:16

标签: asp.net-mvc asp.net-mvc-3 customvalidator

在我的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;
    }
}

以上工作在验证和停止创建/编辑操作进入数据库方面起作用。但是当表单返回到View时,没有显示错误消息!

对评论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请求之后。

2 个答案:

答案 0 :(得分:0)

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

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

@Html.ValidationSummary(false)

这将告诉摘要控件摘要显示所有错误(将其设置为'true',默认值,将告诉控件仅显示模型级错误。)

答案 1 :(得分:0)

我认为您可能想要做的是使用此方法

 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,并在Controller中确保检查 ModelState.IsValid 并返回原始视图(如果它无效)。应该这样做。