public class Dinner
{
public string ID { get; set; }
public string Title { get; set; }
public Category Category { get; set; }
public DateTime? DateCreated { get; set; }
}
该类的模型视图(重要部分)是
public class DinnerModelView
{
...
[UIHint("DatePicker")]
[DateTime(ErrorMessage = "Invalida date")]
public DateTime? DateCreated { get; set; }
}
DateTimeAttriburte是
public class DateTimeAttribute : ValidationAttribute
{
public DateTimeAttribute () : base (() => "Invalid date") { }
public DateTimeAttribute(string errorMessage) : base(() => errorMessage) { }
public override bool IsValid(object value)
{
if (value == null)
return true;
bool isValid = false;
if (value is DateTime)
isValid = true;
DateTime tmp;
if (value is String)
{
if(String.IsNullOrEmpty((string)value))
isValid = true;
else
isValid = DateTime.TryParse((string)value, out tmp);
}
return isValid;
}
}
但是模型状态错误仍然表示“值'xxxx'对于DateCreated无效。” 我无法替换此消息。为什么?
答案 0 :(得分:0)
使用protected ValidationAttribute(string errorMessage)
代替
protected ValidationAttribute(System.Func errorMessageAccessor)
。后者用于访问资源文件中定义的字符串。查看http://msdn.microsoft.com/en-us/library/cc679238.aspx
答案 1 :(得分:0)
由于DateCreated属性的类型为DateTime,因此MVC会在检查DateTimeAttribute之前以某种方式验证它,从而永远不会出现自定义错误消息。
如果您将DateCreated更改为字符串,它可能会起作用。但由于您必须将值保存到数据库,因此您不希望更改DateCreated类型。因此,您可以创建一个名为DateCreatedStr的新属性,并让用户将数据输入到此属性中。在保存数据之前,您可以将(已验证的)数据从DateCreatedStr移动到DateCreated。
我知道这不是一个好方法,但它有效!