我正在使用 AjaxSubmit 发布表单,并且使用 XVal(RuleException 方式)完成了服务器端验证。我没有使用 try/catch 方式将错误添加到模型然后发送到视图。相反 - 我想使用 HandleError 属性,并在 OnException 中将错误添加到模型中。主要问题是我如何将这些错误作为 Ajax 调用的结果?
1 回答
目前还没有一个很好的解决方案。正确地执行此操作需要客户端验证框架(因为要显示错误,您需要动态更改 HTML 页面),并且直到最近,ASP.NET MVC 还没有这个。但是,ASP.NET MVC 2 预览版 2 引入了客户端验证,因此可以合理地推测可能很快会在框架中构建一些东西。
但是,与此同时,HandleErrorAttribute 不会帮助您。HandleErrorAttribute 只知道如何重定向到错误页面,这通常不是您想要响应服务器端验证错误的操作,即使是“正常”POST,当然也不是 AJAX 帖子。
您确实需要处理两种不同的情况:
- 验证错误不是灾难性的失败;它们只是糟糕的用户数据,这是您应该预料到的。您只需要将信息返回到页面,以便可以标记页面以告诉用户如何修复他们的数据。
- 您还需要处理灾难性故障,例如意外异常。这类似于 HandleErrorAttribute 所做的,只要您可以向用户显示一条消息,但您不必将该消息与页面上的特定字段匹配。
要处理第一种错误场景,您需要将模型状态包装到一个可在 JavaScript 代码中解析的对象中;JSON 显然适合这里。然后,您需要在客户端使用 JavaScript 代码来解析此对象并标记表单字段。如果您绑定到现有的客户端验证框架,这会更容易,该框架已经包含用于标记表单字段的代码。
要处理第二种类型的错误,您可以扩展 HandleErrorAttribute 以便在发生灾难性故障时提供 JSON 而不是 HTML。同样,您将需要编写将在发生故障时执行的 JavaScript 代码——jQuery 的全局ajaxError
事件在这里很有用——检测您创建的这种结构化错误信息并向用户显示某种有用的消息。
如果这一切听起来有点牵强,那么,这就是为什么等待并看看 MVC 2 最终发布时将内置什么内容可能更有意义。