2009-01-27 42 views
0

我還沒有真正嘗試過這種方式,並希望快速回答​​是或否。我可以從MVC動作返回JsonResult並仍然利用驗證嗎?

我剛剛瞭解如何使用來自helpful stackoverflow question的JSonResult。

我想知道的是我可以使用這種動作結果,但仍然利用validation provided by the MVC model

如果我返回一個Json結果和一個驗證錯誤,它會自動返回一個由驗證ajax邏輯捕獲的不同結果類型嗎?

回答

2

默認驗證消息是在ModelBind(又名接受請求數據並將其應用於對象)時創建的。這可以通過標準表單提交,或Ajax或任何其他方式完成。

驗證消息存儲在ViewData.ModelState中。

驗證消息的渲染是使用HtmlHelpers完成的,該HtmlHelpers只查看ModelState並渲染任何適用的消息。 HtmlHelpers在服務器端完成,作爲渲染視圖的一部分。返回JSON跳過渲染。您可以返回一個部分視圖,它將呈現屬於用戶控件一部分的任何驗證消息。

這就是說,如果您的控制器操作模型綁定並返回JSON,它仍然會在ViewData.ModelState中生成適當的驗證信息。如果你想使用它,信息就在那裏,但它需要被移動到你的模型中,你的客戶端JavaScript代碼需要知道如何處理它。

2

不,內置的JsonResult會將它給予的對象序列化爲Json並將其發送出去。如果您想發送驗證錯誤,您必須將這些信息放入您自己的對象中,並通過Json發送這些信息。

+0

所以所有的驗證模型功能只適用於Form.Begin(...)的權利? – 2009-01-27 08:01:53

+0

不完全。您可以在沒有表單的情況下顯示驗證消息。驗證顯示信息存儲在ViewData.ModelState中。您用於驗證的HtmlHelpers只需查看此對象進行渲染,而不需要在表單內。 – anonymous 2009-01-27 13:16:06

3

我所做的是編寫我自己的繼承自JsonResult的ExtendedJsonResult類,最初是爲了將JavaScriptConverters註冊到序列化過程,但後來我允許添加一個CheckContextForErrors方法來查看模型狀態錯誤上下文並向json結果數據添加錯誤(屬性名稱,嘗試值,消息)。

我實現了我自己的HandleJsonErrorInfo類(基於HandleErrorInfo)和HandleJsonErrorAttribute,它們在Action上聲明,它將攔截任何未處理的異常並將異常消息作爲JSON返回。

客戶端我可以檢查JSON響應中是否存在ExceptionMessages數組,然後迭代每個錯誤。

+0

不錯。 [HandleError]在我要學習的東西列表上(http://stackoverflow.com/questions/183316)。看起來像一個聰明的解決方案。我只是不清楚是否有內置機制返回JSON錯誤。我曾經使用過JSON,所以我甚至不知道是否有一個約定的錯誤或不。 – 2009-01-28 02:01:43

相關問題