我有一個實現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
}
}
我不是手動糾正輸入的數據。我添加了使我的對象有效的附加數據。 – 2011-04-14 21:27:19
@B Z,你正在做的是違背良好的做法。您應該使用視圖模型和映射圖層,該圖層將在用戶接收的視圖模型與將傳遞到服務層的相應模型之間進行映射。因此,您的控制器操作應該將視圖模型作爲輸入參數,並且在確保ModelState有效之後,它意味着第一級驗證通過(例如必填字段,格式等)。接下來,您映射到您的業務模型並傳遞到服務層。這是服務層報告模型中的任何業務錯誤。 – 2011-04-14 21:28:25
例如我的對象有一個子集合。我的商業規則說,至少有一個項目必須位於此子集合中。然而,這不是由用戶輸入的......特定的業務領域有點難以解釋。如果你想要更多的信息,我會想到一個更簡單的場景...... – 2011-04-14 21:29:49