我还没有真正尝试过这个,希望能得到一个快速的是或不是的答案。
我正在学习如何使用stackoverflow上有用的问题中的JSonResult。
我想知道的是,我是否可以使用这种ActionResult,同时仍然利用MVC模型提供的验证?
如果我返回一个Json结果,且存在验证错误,它会自动返回一个不同的结果类型,这将被验证ajax逻辑捕获吗?
我还没有真正尝试过这个,希望能得到一个快速的是或不是的答案。
我正在学习如何使用stackoverflow上有用的问题中的JSonResult。
我想知道的是,我是否可以使用这种ActionResult,同时仍然利用MVC模型提供的验证?
如果我返回一个Json结果,且存在验证错误,它会自动返回一个不同的结果类型,这将被验证ajax逻辑捕获吗?
默认验证消息是在ModelBind(也称为获取请求数据并将其应用于对象)时创建的。这可以通过标准表单提交,ajax或任何其他方式完成。
验证信息存储在 ViewData.ModelState 中。
验证消息的渲染是使用HtmlHelpers完成的,这些HtmlHelpers只是查看ModelState并渲染任何适用的消息。 HtmlHelpers是在服务器端作为渲染视图的一部分完成的。返回JSON会跳过渲染。你可以返回一个部分视图,它会渲染用户控件中的任何验证消息。
话虽如此,如果您的控制器动作模型绑定并返回JSON,则仍会在 ViewData.ModelState 中生成适当的验证信息。如果您希望使用此信息,则可以使用它,但它需要移动到您的 Model 中,您的客户端 JavaScript 代码需要知道该如何处理它。
我所做的是编写自己的ExtendedJsonResult类,该类继承自JsonResult,最初是为了添加将JavaScriptConverters注册到序列化过程中的功能,但后来,我添加了一个CheckContextForErrors方法,该方法查看上下文的模型状态错误并将错误添加到JSON结果数据中(属性名称,尝试的值,消息)。
我实现了我的自己的HandleJsonErrorInfo类(基于HandleErrorInfo),并声明了HandleJsonErrorAttribute在操作中拦截任何未处理的异常并将异常消息返回为JSON。
客户端可以检查JSON响应中是否存在ExceptionMessages数组,然后迭代每个错误。
不,内置的JsonResult只会将其所接收到的对象序列化为Json并发送到网络。如果您想发送验证错误,您需要将这些信息放入自己的对象中并通过Json发送。