在我的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请求之后。
答案 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 并返回原始视图(如果它无效)。应该这样做。