2009-06-11 164 views
2

我已经阅读了大量有关验证和asp.net mvc的文章,大多数都倾向于指向模型中的验证。我看到的问题是他们不处理不同的情况,或者至少,他们没有表明他们将如何实现,例如,部分验证ASP.NET MVC

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

任何人都可以指向我的任何mvc验证文章,处理上述类型的问题?还是有人有任何建议来处理像这样的验证的最佳做法?

我曾经想过引入诸如创建,读取,更新,删除等“验证操作”,然后根据所使用的上下文来验证同一位数据。有人有这样的想法吗?

预先感谢任何帮助

回答

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; 
    }