2010-05-21 193 views
2

我正在ASP.NET MVC應用程序中工作。我有一個視圖模型如下:asp.net MVC ModelState.IsValid返回false

public class SampleInterestViewModel 
{ 
    //Properties defined 
    //One such property that shows an error in ModelState is as follows 
    public DateTime? SampleDate { get; set; } 
} 

從UI角度用戶可以輸入日期爲mmddyyyy。當用戶輸入 01012001這樣的格式時,控制器中的我的ModelState.IsValid代碼片段返回false。當我在ModelState中快速觀察時,發現Propery「SampleDate」的錯誤,並說「值01012001對SampleDate無效」。

在我的模型綁定器中,在OnModelUpdated事件期間,我嘗試將值01012001設置爲01/01/2001,並將其指派回SampleInterestViewModel.SampleDate,認爲ModelState.IsValid可能會返回true,而不會出現該錯誤。但是仍然ModelState.IsValid是false,當我查看ModelState字典時,這個特定的屬性在它的集合中仍然存在這樣的錯誤。

最後,我試圖格式化01012001並將值01/01/2001直接更新到ModelState字典中的Property SampleDate。但是仍然ModelState.IsValid爲false,顯示SampleDate屬性的相同錯誤。無法弄清楚爲什麼ModelState.IsValid的工作原理以及它被設置爲false的方式和時間。

如果用戶在UI中輸入01012001,我仍然需要在modelbinder中將其格式設置爲01/01/2001,並確保ModelState.IsValid爲true,以便我的控制器代碼的其餘部分可以按預期工作。在UI中,我正在做一個AjaxSubmit來發布sampleDate值。

任何想法或意見。

回答

4

我可以看到一些解決方案:

  1. 模型中的粘結劑固定格式後,您可以用ModelState["SampleDate"].Errors.Clear();清除的ModelState錯誤。
  2. 使用JavaScript驗證輸入以強制用戶輸入正確的格式。
  3. 使用JavaScript在表單發佈之前更改用戶的格式。

我認爲1和2的組合是你最好的選擇。

4

嘗試用你的行動參數白名單綁定,與

Bind(Include="param1,param2...") 

而在該列表中,ommit您自己綁定參數。閱讀this ScottGu的帖子瞭解更多信息。

+0

非常好的答案。但是我仍然會按照@布拉德利的方式繼續前進。但從你的回答中我學到了一些新東西。 – SARAVAN 2010-05-21 17:17:52

相關問題