DataAnnotation可以阻止用户发布数据库中不存在的表单字段吗?

时间:2011-02-15 08:40:14

标签: asp.net-mvc asp.net-mvc-3

我有一个使用asp.net mvc创建的留言簿表格。 必须通过从下拉控件中选择值来填写有效的gender表单字段。下拉控件有3个选项,即默认选择“--Select--”,“Female”,“Male”和“--Select--”。数据模型已设置为强制访问者选择女性或男性,但不选择“ - 选择 - ”。

我们知道访问者有机会调整表单数据,因此他可以提交指向数据库中不存在的值的gender表单字段。

我的问题是:

  1. DataAnnotation可以阻止用户发布数据库中不存在的表单字段吗?
  2. 对抗此尝试的首选方法是什么?在调用SaveChanges()
  3. 之前,是否必须先检查提交的性别表单字段?

2 个答案:

答案 0 :(得分:1)

这取决于您是否需要向用户提供特定错误或干净的验证消息。如果用户试图篡改表单帖子,我不会太在意用户体验。

如果您关心这一点,可以使用IValidatableObject界面对合法值进行验证:

public class Person : IValidatableObject
{
    public string Gender { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        //ValidGenders is a list of valid values, retrieved from the database
        if (!ValidGenders.Contains(Gender))
        { 
            yield return new ValidationResult("Gender is not valid", new string[] { "Gender" });
        }
    }
}

模型验证使用IValidatableObject执行验证,就像使用数据注释验证一样。

另一方面,如果您不关心用户体验,可以在数据库中发生错误,并使用标准错误处理管道处理问题。假设您的外键约束已到位,操作将失败,因为在Genders表中找不到Gender值,或者您的设置可能是什么。

答案 1 :(得分:0)

不确定您是否使用任何形式的DTO或Business Objects,但除了验证对象客户端(或MVC内)之外,您的对象也可能值得验证。

这样您就可以在遇到数据库之前发现任何问题。有关该主题的SO上有趣的帖子可以在这里找到:Should Business Objects or Entities be Self-Validated?