2010-11-10 68 views
2

我正在使用实体框架+ SQL Server数据库,并使用DataAnnotations部分类来验证数据。对于像Required和Range这样的东西,这可以正常工作,但我无法使DataType验证器正常工作。MVC2:使用DataAnnotations来验证数据类型

这里是(自定义)注释的例子:

[DataTypeWholeNumberAttribute(ErrorMessage = "Zip must be a whole number")] 
public object Zip{ get; set; } 

...和控制器代码...

[HttpPost] 
public ActionResult Edit(NamedInsuredViewModel viewModel) 
{ 
    try 
    { //breakpoint here (opening squiggly bracket) shows .Zip is already null 
     if (ModelState.IsValid) 
     ...save, etc... 
    } 
} 

而且我知道发生了什么:邮编中的数据类型数据库是int,因此默认验证正在捕获,并且在我的验证器可以到达之前应用通用错误消息“value [x]对[FieldName]无效”(为了证明这一点,我还添加了相同的验证器到一个字符串字段,它工作得很好)。我不知道的是,我怎么能解决这个问题(不,我不能改变数据库使用字符串的一切)?

在这篇文章中提供了一些建议(http://forums.asp.net/p/1608322/4162819.aspx#4162819),但到目前为止没有任何帮助。

在此先感谢。

PS - 是否真的没有办法验证原始数据类型而不创建自定义属性?

+1

为什么Zip是一个对象?为什么它不是一个整数? – jfar 2010-11-10 16:45:35

回答

0

我认为错误是将一些名为“viewModel”的东西传递给Edit Action。 ViewModel用于将数据传递给视图来呈现它。 提交表单时,数据必须映射到实体而不是viewModel。

[HttpPost] 
public ActionResult Edit(YourEntity entity) 
{ 
    try 
    { //breakpoint here (opening squiggly bracket) shows .Zip is already null 
     if (ModelState.IsValid) 
     ...save, etc... 
    } 
} 
0

将您的自定义验证器应用到课程中。然后将你的类实例作为验证器的参数传入,而不是字符串。然后,您可以对相应的属性执行验证,而不考虑类型。