【发布时间】:2010-10-03 16:43:39
【问题描述】:
我还没有真正尝试过,希望能快速得到是或否的答案。
我刚刚从helpful stackoverflow question 学习使用JSonResult。
我想知道的是我可以使用这种actionresult,但仍然可以利用validation provided by the MVC model吗?
如果我返回 Json 结果并且存在验证错误,它会自动返回由验证 ajax 逻辑捕获的不同结果类型吗?
【问题讨论】:
我还没有真正尝试过,希望能快速得到是或否的答案。
我刚刚从helpful stackoverflow question 学习使用JSonResult。
我想知道的是我可以使用这种actionresult,但仍然可以利用validation provided by the MVC model吗?
如果我返回 Json 结果并且存在验证错误,它会自动返回由验证 ajax 逻辑捕获的不同结果类型吗?
【问题讨论】:
我所做的是编写自己的继承自 JsonResult 的 ExtendedJsonResult 类,最初是为了将注册 JavaScriptConverters 的能力添加到序列化过程中,但这后来允许我添加一个 CheckContextForErrors 方法来查看模型状态的错误上下文并向 json 结果数据(属性名称、尝试值、消息)添加和错误。
我实现了自己的 HandleJsonErrorInfo 类(基于 HandleErrorInfo)和 HandleJsonErrorAttribute,它在 Actions 上声明,将拦截任何未处理的异常并将异常消息作为 JSON 返回。
客户端我可以检查 JSON 响应中是否存在 ExceptionMessages 数组,然后遍历每个错误。
【讨论】:
在您进行 ModelBind 时会创建默认验证消息(也就是获取请求数据并将其应用于对象)。这可以通过标准的表单提交、ajax 或任何其他方式来完成。
验证消息存储在 ViewData.ModelState 中。
验证消息的呈现是使用 HtmlHelper 完成的,它只查看 ModelState 并呈现任何适用的消息。 HtmlHelper 作为渲染视图的一部分在服务器端完成。返回 JSON 会跳过渲染。您可以改为返回一个局部视图,该视图将呈现作为用户控件一部分的任何验证消息。
也就是说,如果您的控制器动作模型绑定并返回 JSON,它仍会在 ViewData.ModelState 中生成正确的验证信息。如果您想使用它,信息就在那里,但需要将其移至您的模型,并且您的客户端 JavaScript 代码需要知道如何处理它。
【讨论】:
不,内置的 JsonResult 只会序列化它提供给 Json 的对象并将其发送到网络中。如果您想发送验证错误,则必须将该信息放入您自己的对象中并通过 Json 发送。
【讨论】: