部分验证ASP.NET MVC

时间:2009-06-11 21:15:30

标签: asp.net-mvc validation

我现在阅读了很多关于验证和asp.net mvc的文章,大多数都倾向于指出模型中的验证。我与他们所看到的问题是,他们没有处理不同的情况,或者至少,他们没有表明如何实现它们,例如。

创建或更新用户帐户时,电子邮件地址必须与电子邮件确认输入匹配。此电子邮件确认输入不是模型的一部分,它纯粹是为了帮助正确的用户输入,这可能被称为虚拟财产。当用户使用他们的电子邮件地址登录时,验证不应该尝试将电子邮件与确认输入匹配,但是,在我看到的所有示例中,无法区分在相同数据中验证相同数据的情况。不同的方式。

有人能指出我处理上述类型问题的任何mvc验证文章吗?或者是否有人对如此处理验证的最佳实践有任何建议?

我曾考虑引入“验证操作”,例如创建,读取,更新,删除,然后我可以根据使用它的上下文验证相同的数据位。有人想过以这种方式做事吗?

提前感谢您提供任何帮助

2 个答案:

答案 0 :(得分:2)

这就是我使用与模型分离的Validators的原因。所以,我有IValidator和不同的验证器。对于实例化验证器,我使用DI Container(例如StructureMap)。

这里描述了(不是我): Issues with my MVC repository pattern and StructureMap

答案 1 :(得分:1)

根据我的经验

1.验证器应该从控制器解耦到单独的服务层,例如,在本教程中显示: http://www.asp.net/learn/mvc/tutorial-38-cs.aspx

2.服务方法可以封装所有类型的验证。例如:

    public bool PlaceBooking(Booking booking)
    {
      //Model validation
      IEnumerable<ErrorInfo> errors = DataAnnotationsValidationRunner.GetErrors(booking);
      if (errors.Any())
          _validationDictionary.AddErrors("error", errors);

      // Business rule: Can't place bookings on Sundays
      if(booking.ArrivalDate.DayOfWeek == DayOfWeek.Sunday)
         _validationDictionary.AddError("ArrivalDate", "Bookings are not permitted on Sundays");

      if (!_validationDictionary.IsValid) return false;

      //Errors comming from Data Access Layer
      try
      {
         return _dao.Save(booking);
      }
      catch (DBExecutionException ex)
      {
         if (ex.ResultCode == ResultCodes.RES_UNIQUEINDEX)
          _validationDictionary.AddError("error", "Booking already exists.");
         else
          _validationDictionary.AddError("error", "Some other DB issue happens.");
       }
      return false;
    }