代码之家  ›  专栏  ›  技术社区  ›  onefootswill

客户端上使用Angular进行服务器端表单验证

  •  1
  • onefootswill  · 技术社区  · 8 年前

    我目前有一个项目,我正在将客户端内容转换为Angular,因为我喜欢它的绑定方面。目前,我正在服务器上进行表单验证。在客户机和服务器上做了多年之后,我发现我的首选是通过向服务器发出AJAX请求来做这件事。因此,设计上没有客户端表单验证。

    这很管用,因为我能够使用jQuery点亮ModelState中的表单,并将其作为json发送回客户端。

    现在是Angular。我想保留这个实现,但我觉得我是在与这样做的技术作斗争。Angular似乎坚持客户端验证。

    在收到带有验证错误的AJAX响应时,是否有办法告诉Angular验证机制什么是无效的,以便我仍然可以使用服务器端验证?

    编辑 我应该包括一个链接,链接到一个我基于其实现的帖子- http://timgthomas.com/2013/09/simplify-client-side-validation-by-adding-a-server/ 如您所见,它不使用Angular。如果能从服务器端的角度来看它,并让它与AngularJ一起工作,那就太好了

    谢谢

    1 回复  |  直到 8 年前
        1
  •  5
  •   George    7 年前

    这是一种方法,取决于您愿意在当前代码中更改多少,并假设一些事情。

    让你有一张这样的表格

    <form name="form" novalidate ng-submit="update(form)">
        <input type="text" ng-model="Input" name="Input"/>
        <button type="submit">Save</button>
    </form>
    

    那么您的更新函数应该如下所示

    function update(form) {
        testResource.save($scope.Input)
            .$promise
            .then(function (response) {
                console.log("Success");
            })
            .catch(function (response) {
                console.log("fail");
                for (var i = 0; i < response.data.length; i++) {
                    form[response.data[i].Name].$setValidity(response.data[i].Error, false);
                }
            });
    }
    

    失败响应中的数据结构如下

    [{ Name: "Input", Error: "required" }];
    

    这应该允许您在服务器上执行所有验证,并将其传递给angle来处理。

    更详细地说,在提交函数上,您将角度表单发送到控制器,然后当角度资源得到错误响应时,您将错误添加到具有错误的表单属性。这意味着输入的名称必须与从错误响应中传递的名称相同。