我现在阅读了很多关于验证和asp.net mvc的文章,大多数都倾向于指出模型中的验证。我与他们所看到的问题是,他们没有处理不同的情况,或者至少,他们没有表明如何实现它们,例如。
创建或更新用户帐户时,电子邮件地址必须与电子邮件确认输入匹配。此电子邮件确认输入不是模型的一部分,它纯粹是为了帮助正确的用户输入,这可能被称为虚拟财产。当用户使用他们的电子邮件地址登录时,验证不应该尝试将电子邮件与确认输入匹配,但是,在我看到的所有示例中,无法区分在相同数据中验证相同数据的情况。不同的方式。
有人能指出我处理上述类型问题的任何mvc验证文章吗?或者是否有人对如此处理验证的最佳实践有任何建议?
我曾考虑引入“验证操作”,例如创建,读取,更新,删除,然后我可以根据使用它的上下文验证相同的数据位。有人想过以这种方式做事吗?
提前感谢您提供任何帮助
答案 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;
}