我用数据说明,检查就是BEING输入的数据,但我坚持,当涉及到更多的自定义的方式来验证数据。

我需要在其上运行的数据库查询,看看是否存在的东西有或没有,然后报告给用户,如果“自定义数据库检查错误”,如“公司名称已经存在”

我怎样才能与dataannotations一起实现这样的事?

我所有查询使用LINQ和实体框架附带3.5SP1进行等

/ M

有帮助吗?

解决方案

扩展数据注解

自定义属性

您必须编写您自己的属性,会做你的对象实例验证针对数据存储。

请确保你的类继承System.ComponentModel.DataAnnotations.ValidationAttribute类:

public class MustNotExist: ValidationAttribute
{
    ...
}

注意

当我需要验证的对象是数据存储器内唯一我碰到一个类似的情况。但是,这种验证是不可能对实体类本身,因为它应该只对正在创建的,但不是当你从数据存储已经回到你的实体的实体工作。

我的解决办法是有一个单独的接口,类和属性。

public interface IExternalValidator ...

class DBUniqueValidator: IExternalValidator ...

class ValidateExternallyAttribute: FilterAttribute, IActionFilter
{
    ...
    public ValidateExternallyAttribute(Type validatorType, Type entityType) ...
    ...
}

我能够把我的属性上得到实体参数控制器动作。滤波器action属性然后检查控制器动作的参数(它可以很容易地访问他们的类型和值)和(在属性定义中提供的类型)执行针对正确的参数外部确认和验证失败时填充的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
}

这样我可以只在真正需要它的行动运行外部的验证,这种技术也帮助我的控制器操作的代码保持干净和短。所有我必须做的是检查是否有任何模型状态错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top