2011-04-14 47 views
4

我有一個實現IValidateObject的類。我在控制器的操作中做了一些額外的工作後,我的業務規則得到滿足。我遇到的問題是ModelState.IsValid仍然是錯誤的。我試圖找到如何重置或重新運行,以便更新ModelState。我嘗試了TryUpdateModel,這觸發了Validate方法,如果我通過我的規則步入現在是有效的,但ModelState.IsValid仍然是假的(我可以看到它仍然抱怨同樣的規則)。IValidateObject如何清除/重置ModelState.IsValid

[HttpPost] 
    public ActionResult Create(MyModel model) 
    { 
     //ModelState.IsValid is False at this point 

     //model.Do More Stuff To Satisfy IValidateObject rule. At this point all my rules are valid 

     TryUpdateModel(model); // <-- If run TryUpdateModel and step through, I can see my rule is valid 

     if (ModelState.IsValid) // this is still False 
     { 
      //Save 
     } 
    } 

更新:

我結束了通話

ModelState.Clear(); 

[HttpPost]

public ActionResult Create(MyModel model) 
    { 
     //model.Do More Stuff To Satisfy IValidateObject rule. At this point all my rules are valid 
     ModelState.Clear(); 

     TryUpdateModel(model); 

     if (ModelState.IsValid) 
     { 
      //Save 
     } 
    } 

回答

3

我沒有看到這一點。您有一個控制器操作,接收用戶輸入,如果無效,您將手動糾正,並且願意隨後測試該模型是否有效。如果你已經手動糾正了它,爲什麼你再次測試?你知道這將是有效的,不是嗎?寫一個你壓倒一切的驗證規則有什麼意義?

另請注意,您在POST控制器操作(如更新模型屬性)時手頭正在進行的所有操作都應該跟一個ModelState.Remove("TheKeyOfThePropertyYouHaveManuallyUpdated"),以便這些手動更改會產生一些效果。

+0

我不是手動糾正輸入的數據。我添加了使我的對象有效的附加數據。 – 2011-04-14 21:27:19

+2

@B Z,你正在做的是違背良好的做法。您應該使用視圖模型和映射圖層,該圖層將在用戶接收的視圖模型與將傳遞到服務層的相應模型之間進行映射。因此,您的控制器操作應該將視圖模型作爲輸入參數,並且在確保ModelState有效之後,它意味着第一級驗證通過(例如必填字段,格式等)。接下來,您映射到您的業務模型並傳遞到服務層。這是服務層報告模型中的任何業務錯誤。 – 2011-04-14 21:28:25

+0

例如我的對象有一個子集合。我的商業規則說,至少有一個項目必須位於此子集合中。然而,這不是由用戶輸入的......特定的業務領域有點難以解釋。如果你想要更多的信息,我會想到一個更簡單的場景...... – 2011-04-14 21:29:49