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

时间:2016-05-22 01:08:45

标签: angularjs asp.net-mvc

我目前有一个项目,我将客户端的东西转换为Angular,因为我喜欢它的绑定方面。目前,我正在服务器上进行表单验证。经过多年在客户端和服务器上的操作,我发现我的偏好是通过对服务器的AJAX请求来实现。因此,根据设计,没有客户端表单验证。

它是一种享受,我可以使用jQuery来点亮表单,其中包含ModelState中的任何验证错误,这些错误将作为json发送回客户端。

现在是Angular。我想保留这个实现,但我觉得我正在反对这项技术。 Angular似乎坚持客户端验证。

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

修改 我应该添加一个链接到我基于我的实现的帖子 - http://timgthomas.com/2013/09/simplify-client-side-validation-by-adding-a-server/如您所见,它不使用Angular。最好采用它的服务器端方面并使其与AngularJs一起使用

谢谢

1 个答案:

答案 0 :(得分:5)

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

让我们有一个这样的表格

<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" }];

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

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