我看了很多例子,而且我正在按照他们的建议做,但我一直得到一个InvliadCastException
错误描述:
无法将'System.DateTime'类型的对象强制转换为'System.String'
我从ASP.NET MVC4应用程序中的出生日期文本字段中获取日期,格式如下20/09/1986
这是我的代码,我只希望18岁以上的用户能够注册。
public class AgeValidator : ValidationAttribute
{
public override bool IsValid(object value)
{
string format = "dd/MM/yyyy HH:mm:ss";
DateTime dt;
DateTime.TryParseExact((String)value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
DateTime today = DateTime.Today;
int age = today.Year - dt.Year;
if (dt > today.AddYears(-age)) age--;
if (age < 18)
{
return false;
}
return true;
}
}
然后使用我的自定义验证:
[Required]
[Display(Name = "Date Of Birth")]
[AgeValidator(ErrorMessage="You need to be at least 18 years old to vote.")]
public DateTime DateOfBirth { get; set; }
如何正确解析DateTime?
答案 0 :(得分:1)
这听起来像是一个使用重载方法的好地方:
public override bool IsValid(DateTime value)
{
DateTime today = DateTime.Today;
int age = today.Year - value.Year;
if (value > today.AddYears(-age)) age--;
if (age < 18)
{
return false;
}
return true;
}
public override bool IsValid(string value)
{
string format = "dd/MM/yyyy HH:mm:ss";
DateTime dt;
if (DateTime.TryParseExact((String)value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
{
return IsValid(dt);
}
else
{
return false;
}
}
public override bool IsValid(object value)
{
return IsValid(value.ToString());
}
答案 1 :(得分:0)
在尝试将object value
解析为DateTime
之前,您可以检查DateTime
是否属于if(value == null)
{
throw new ArgumentNullException("value");
}
DateTime dt ;
if(value is DateTime)
{
dt = (DateTime)value;
}
else
{
string format = "dd/MM/yyyy HH:mm:ss";
DateTime.TryParseExact(value.ToString(), format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
}
//rest of your code
类型:
{{1}}