2010-10-18 129 views
0

在我的域模型我有一個具有多個屬性,我已經裝飾了驗證元數據的Person對象:MVC域模型驗證

[Required(ErrorMessage = "First Name Required")] 
public string FirstName { get; set; } 

[Required(ErrorMessage = "Age Required")] 
public int Age { get; set; } 

我控制器返回的人集合到視圖,以便用戶可以填寫他們的詳細信息。然而,只有第一個人需要提供一個年齡,所以我只需要驗證集合中第一個人的年齡。

但是,由於Age屬性中的驗證元數據,模型驗證失敗,因爲未爲集合中的其他人提供年齡。

有什麼辦法可以關閉集合中其他Person對象的驗證嗎?

或者是否需要重新排列我的模型。

回答

0

我的本能是用自定義屬性來修飾動作或控制器,以攔截請求的驗證。現在

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    var modelState= filterContext.Controller.ViewData.ModelState; 
    var incomingValues = filterContext.Controller.ValueProvider; 
    // depending on how your app works, 
    // ascertain the Condition that applies when you want the  age field validated 
    // Then: 
    var keys = modelState.Keys.Where(x => ![Condition]); 
    foreach(var key in keys) // These keys don't satisfy the Condition for validation 
    modelState[key].Errors.Clear(); 
} 

你的問題歸結爲搞清楚狀況:例如,在ValidateOnlyFirstPersonInCollection屬性,可以如下重寫OnActionExecuting方法。以上給出了一個粗略的想法。有關更多詳細信息,請參閱Steve Sanderson關於MVC 2的書籍,第486頁。