2015-03-19 40 views
0

使用MVC5,我有一個int值不可爲空並且不應爲空的模型,但是我不希望模型聯編程序自動需要該字段(視圖綁定到一個列表<>然後在列表中任何一個項目可以是空的,因此不會保存到數據庫),所以我設定的Application_Start()以下:當控制器驗證錯誤返回視圖時,AddImplicitRequiredAttributeForValueTypes = false不起作用

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

能正常工作時,我的視圖最初顯示,但當用戶單擊保存時,所有驗證都會通過,然後控制器操作會執行其他跨記錄驗證(跨記錄的總數必須等於100)。如果驗證失敗,然後我設置自定義錯誤並返回的觀點:一旦總量修正

ModelState.AddModelError("", "Total Allocation must equal 100%."); 
return View("Shipment", shipment); 

,用戶再次點擊保存,現在 隱含要求確認開始在客戶端發生並且永遠不會將HttpPost發送回控制器 更正:隱式驗證發生在服務器端,而不是客戶端。這與我在Application_Start中關閉的隱式驗證是一樣的(我在調試模式下進行了檢查,當View返回錯誤時它仍然是錯誤的)。

這是一個AddImplicitRequiredAttributeForValueTypes錯誤還是我做錯了什麼?

TIA -VG

回答

0

我發現了一個變通辦法,我不會稱之爲一個「決議」,但至少它是在有人的情況下工作,否則周圍發現這是很有幫助的。起初,我認爲隱式驗證發生在客戶端,但不是,它確實將其加入到Controller中,但ModelState.IsValid現在是false。這很重要,因爲我的解決方法依賴於將控制權發送給控制器。下面是我做的:

//Remove implicit validations 
foreach (KeyValuePair<string,ModelState> stateItem in ModelState) 
{ 
    if (stateItem.Key.Contains("AllocationAmount")) 
    { 
     if (stateItem.Value.Errors.Count > 0 && stateItem.Value.Errors[0].ErrorMessage.Contains("required")) 
     { 
      stateItem.Value.Errors.RemoveAt(0); 
     } 
    } 
} 

//Check Validation 
if (!ModelState.IsValid) 
{ 
    return PartialView("pvShipment", shipment); 
} 

通過檢查有「必需的」錯誤消息,並且之前刪除它檢查ModelState.IsValid特定列,和isValid現在真(只要返回,因爲沒有其他錯誤當然存在),並且能夠繼續保存邏輯。我希望這是有道理的。

-VG

相關問題