【问题标题】:How to utilize server-side data annotation with client-side programming like jsRender如何在 jsRender 等客户端编程中使用服务器端数据注释
【发布时间】:2012-08-13 18:34:04
【问题描述】:

在我们在 MVC4 中使用 WebAPI 之前以及在 jsRender 进入测试版之前,我们使用服务器端编程生成表单。即在视图模型上添加Data Annotations,然后生成一个有很多@Html.EditorFor@Html.LabelFor的表单。 (如果你是一名 MVC 程序员,你就会明白我的意思。)然后 jQuery 验证将帮助我们在客户端进行数据验证,而 DataAnnotation 属性通过检查Model.IsValid 在服务器端完成这项工作。一切都很好。

现在我们有WebAPI。大部分例子是使用Javascript调用Ajax到WebAPI动作来在服务器和客户端之间传输表单数据(主要是json)。 jsRender(或其他类型的模板库)用于呈现数据。

我喜欢进行 Ajax 调用以避免不必要的整页呈现的想法。但主要困难在于,由于表单是作为模板准备的,它绑定到客户端的数据,因此无法将 DataAnnotation 等服务器端技术与 jQuery-validation 结合在一起。而且我们无法使用@Html.EditorFor 生成模板。看来我们失去了许多以前在 MVC3 中所拥有的巨大好处。

那么,各位专家是如何处理这个问题的呢?您是否完全抛弃了服务器端技术,只在模板中写出所有内容供客户端使用?

如果我们只能在客户端做所有事情,我们如何使用 jQuery 验证?我们是否手动添加那些data-val-xxx 标签?

感谢您的任何建议。

【问题讨论】:

    标签: asp.net-mvc-4 data-annotations asp.net-web-api jsrender


    【解决方案1】:

    对 ASP.NET MVC 采用 AJAX 方法确实排除使用 ASP.NET 验证功能。但是,您必须编写自己的服务器端和客户端架构来处理这些场景。基本上,您希望您的 Web API 能够为任何方法抛出验证消息。此外,您希望您的客户端 JavaScript 能够随时处理这些消息。

    在我目前正在开发的 ASP.NET MVC + Knockout 应用程序中,我正在这样做。它涉及:

    • 服务器端。将模型验证错误转换为 JSON 的自定义 ActionFilterAttribute
    • 客户端。一些 JavaScript 技巧来解释验证错误。

    在我对服务器进行的每次 REST 调用时,我都会检查返回时的 HTTP 状态代码。 200 表示成功,应用程序正常进行。 400 表示错误请求,表示返回了一条或多条验证消息。

    400 的情况下,响应正文包含一个带有所有验证消息的 JSON 数组。这些消息是由输入元素的名称和错误消息组成的简单元组。

    我添加了一个新的data-val-server 属性,该属性总是使设置它的输入元素无效。我从服务器获得的数据告诉我放置属性的元素。该属性的值是也来自服务器的错误消息。之后,我只需启动客户端验证,它将解析表单、使表单无效并查看相应的消息。

    【讨论】:

    • 令人印象深刻。你似乎指向了正确的方向。但这听起来确实很辛苦!您是否必须为每种类型的数据创建一个单独的EditorTemplate
    • 糟糕。我已经删除了一些关于自定义 EditorTemplates 的内容。该部分仅用于自动生成 Knockout 绑定,与验证无关。
    • 我已经扩展了我原来的答案。是的,开发这一切需要一些工作,但在我的项目中,我们谈论的是 100 多个 API,它们都可能会或可能不会引发验证错误。所以,对于我的项目,努力得到了回报。客户端架构大约 200 行代码,而服务端 ActionFilterAttribute 大约 30 行代码。
    【解决方案2】:

    【讨论】:

    • 请不要只发布一个链接!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2014-11-01
    • 1970-01-01
    相关资源
    最近更新 更多