2009-01-27 44 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

相关问题