2009-06-11 166 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; 
    }