开发者

MVC2: Using DataAnnotations to validate DataType

开发者 https://www.devze.com 2023-01-24 15:32 出处:网络
I am using Entity Framework + SQL Server DB and am using partial classes with DataAnnotations to validate data.For things like Required and Range, this works fine, but I am unable to get the DataType

I am using Entity Framework + SQL Server DB and am using partial classes with DataAnnotations to validate data. For things like Required and Range, this works fine, but I am unable to get the DataType validators to work.

Here is an example of the (custom) annotation:

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

...and the Controller Code...

[HttpPost]   
public ActionResult Edit(NamedInsuredViewModel viewModel)   
{   
    try  
    { //breakpoint here (opening squiggly bracket) shows .Zip is already null   
        if 开发者_如何学编程(ModelState.IsValid)   
        ...save, etc...
    }
}

And I know what's happening: The DataType of Zip in the database is int, so the default validation is catching that and applying the generic error message "the value [x] is not valid for [FieldName]" before my validator can get to it (to prove this, I also added the same validator to a string field, and it works just fine). What I don't know is, how can I get around that (and no, I can't change the DB to use strings for everything)?

Some suggestions have been offered in this post (http://forums.asp.net/p/1608322/4162819.aspx#4162819), but so far nothing has helped.

Thanks in advance.

PS - is there really no way to validate a primitive DataType without creating a custom Attribute?


I think the error is to pass something called "viewModel" to a Edit Action. ViewModel is intended for pass data to a view to render it. When you submit a form the data have to be mapped to a entity not to a viewModel.

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


Apply your custom validator to the class. Then pass in your class instance as the parameter for your validator instead of as a string. Then you can perform the validation on the appropriate property regardless of type.

0

精彩评论

暂无评论...
验证码 换一张
取 消