我正在使用数据注释来检查正在输入的数据,但是当涉及更多自定义方式来验证数据时,我就陷入困境。
我需要针对数据库运行查询以查看是否存在任何内容,然后在出现“自定义数据库检查错误”时向用户报告,例如“公司名称已存在”
我如何与dataannotations一起实现这样的东西?
我使用linq和3.5sp1附带的实体框架
完成了所有查询/ M
答案 0 :(得分:12)
您必须编写自己的属性,以便针对数据存储验证对象实例。
确保您的班级继承System.ComponentModel.DataAnnotations.ValidationAttribute
班级:
public class MustNotExist: ValidationAttribute
{
...
}
当我需要验证对象在数据存储中是唯一的时,我遇到了类似的情况。但是这种验证在实体类本身是不可能的,因为它应该只适用于那些正在创建的实体,但是当你从数据存储中返回实体时却不行。
我的解决方案是拥有一个单独的接口,类和属性。
public interface IExternalValidator ...
class DBUniqueValidator: IExternalValidator ...
class ValidateExternallyAttribute: FilterAttribute, IActionFilter
{
...
public ValidateExternallyAttribute(Type validatorType, Type entityType) ...
...
}
我能够将我的属性放在获取实体参数的控制器动作上。过滤器操作属性然后检查控制器操作参数(它可以轻松访问其类型和值)并针对正确的参数(在属性定义中提供的类型)运行外部验证器,并在验证失败时填充ModelState错误。
[ValidateExternally(typeof(DBUniqueValidator), typeof(User))]
public ActionResult RegisterUser(User newUser)
{
if (!this.ModelState.IsValid)
{
// act accordingly - probably return some error depending on model state errors
}
// register new user in data store
}
这样我只能对那些实际需要它的动作运行外部验证,这种技术也帮助我的控制器动作代码保持干净和简短。我所要做的就是检查是否存在任何模型状态错误。