【问题标题】:Can i return JsonResult from an MVC action and still take advantage of validation?我可以从 MVC 操作返回 JsonResult 并仍然利用验证吗?
【发布时间】:2010-10-03 16:43:39
【问题描述】:

我还没有真正尝试过,希望能快速得到是或否的答案。

我刚刚从helpful stackoverflow question 学习使用JSonResult。

我想知道的是我可以使用这种actionresult,但仍然可以利用validation provided by the MVC model吗?

如果我返回 Json 结果并且存在验证错误,它会自动返回由验证 ajax 逻辑捕获的不同结果类型吗?

【问题讨论】:

    标签: asp.net-mvc validation


    【解决方案1】:

    我所做的是编写自己的继承自 JsonResult 的 ExtendedJsonResult 类,最初是为了将注册 JavaScriptConverters 的能力添加到序列化过程中,但这后来允许我添加一个 CheckContextForErrors 方法来查看模型状态的错误上下文并向 json 结果数据(属性名称、尝试值、消息)添加和错误。

    我实现了自己的 HandleJsonErrorInfo 类(基于 HandleErrorInfo)和 HandleJsonErrorAttribute,它在 Actions 上声明,将拦截任何未处理的异常并将异常消息作为 JSON 返回。

    客户端我可以检查 JSON 响应中是否存在 ExceptionMessages 数组,然后遍历每个错误。

    【讨论】:

    • 不错。 [HandleError] 在我的学习清单上 (stackoverflow.com/questions/183316)。似乎是一个聪明的解决方案。我只是不清楚是否有内置机制来返回 JSON 错误。我以前用过 JSON,所以我什至不知道是否有错误约定。
    【解决方案2】:

    在您进行 ModelBind 时会创建默认验证消息(也就是获取请求数据并将其应用于对象)。这可以通过标准的表单提交、ajax 或任何其他方式来完成。

    验证消息存储在 ViewData.ModelState 中。

    验证消息的呈现是使用 HtmlHelper 完成的,它只查看 ModelState 并呈现任何适用的消息。 HtmlHelper 作为渲染视图的一部分在服务器端完成。返回 JSON 会跳过渲染。您可以改为返回一个局部视图,该视图将呈现作为用户控件一部分的任何验证消息。

    也就是说,如果您的控制器动作模型绑定并返回 JSON,它仍会在 ViewData.ModelState 中生成正确的验证信息。如果您想使用它,信息就在那里,但需要将其移至您的模型,并且您的客户端 JavaScript 代码需要知道如何处理它。

    【讨论】:

    • 所以没有什么是自动的。我自己很好,只是想确保没有提供一些聪明的东西来通过 JSON 返回验证错误
    【解决方案3】:

    不,内置的 JsonResult 只会序列化它提供给 Json 的对象并将其发送到网络中。如果您想发送验证错误,则必须将该信息放入您自己的对象中并通过 Json 发送。

    【讨论】:

    • 所以所有的验证模型功能只适用于 Form.Begin(...) 对吧?
    • 不完全是。您可以在没有表单的情况下很好地显示验证消息。验证显示信息存储在 ViewData.ModelState 中。您用于验证的 HtmlHelper 只需查看此对象以进行渲染,不需要在表单内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2021-01-10
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多