【问题标题】:Problem with jQuery validate plugin (remote validation)jQuery 验证插件的问题(远程验证)
【发布时间】:2011-10-23 08:40:57
【问题描述】:

我在尝试使用 jQuery Validation plugin 验证用户值时遇到问题。

验证似乎正确触发并完全按照我的意愿调用 Web 服务函数,但即使服务器函数正常工作并返回 true/false 结果,该字段始终无效。

这是客户端的验证码

$('#myForm').validate({
    errorContainer: container,
    errorLabelContainer: $("ol", container),
    wrapper: 'li',
    meta: "validate",
    rules: {
        Code: { required: true, maxlength: 15, remote: function () {
            return {
                type: "POST",
                url: GetBaseWSUrl() + 'MyService.asmx/IsValidCode',
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify({ umltCode: $('#Code').val() })
            }
        }
        },
        Description: { required: true, maxlength: 255 },
        Notes: { maxlength: 255 }
    },
    messages: {
        // ... omitted for brevity
    },
    submitHandler: function (form) {
        saveObject(form);
    }
});

使用 fiddler 我可以看到对服务器进行了调用,并且服务器正在返回一个 json true/false 值,具体取决于以下示例中的情况:

{"d":false}

{"d":true}

尽管如此,插件仍然将该字段标记为无效。有什么建议吗?

编辑:这是我的服务器功能

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class MyService : System.Web.Services.WebService
{
    [WebMethod]
    public object IsValidCode(string umltCode)
    {
        [...]

        if (u != null)
            return false;

        return true;
    }
}

【问题讨论】:

  • 我认为,remote 函数应该返回 true 或 false,而是返回一个对象 {d: true}

标签: jquery asp.net web-services jquery-validate


【解决方案1】:

问题在于,而不是

true

您的网络服务返回

{"d":true}

d 属性应该被移除。

ASMX 被认为是遗留的,所以我会首先摆脱它。但在此之前,您还可以使用 dataFilter 属性,如下所示:

remote: function() {  
    return {  
        type: "POST",
        url: GetBaseWSUrl() + 'MyService.asmx/IsValidCode',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: JSON.stringify({ umltCode: $('#Code').val() }),
        dataFilter: function (data) {
            var x = (JSON.parse(data)).d;
            return JSON.stringify(x); 
        }  
    };   
}

【讨论】:

  • 您能否建议如何为asmx 服务执行此操作?我认为这就是 bool 类型答案是 JSON 序列化的方式。
  • @Zruty,ASMX 被认为是遗留技术。我不会打扰它。如果我必须调用这样的服务,我会围绕它编写一个服务器端包装器,以便完全控制输出。
  • @Darin Dimitrov:感谢您的回答。我怎样才能删除它?我已经编辑了我的问题以添加服务器功能原型。我有一个 asmx 网络服务.... :(
  • @Lorenzo,您可以将其替换为 WCF Web 服务,或者您将编写一个自定义 HTTP 处理程序,该处理程序在内部调用该服务并返回格式正确的结果。或者简单地使用服务器端 HTTP 处理程序 .ASHX 来执行验证。
  • @Darin Dimitrov:我不得不稍微修改您的答案,因为该函数需要一个 json 真实值,但您的方法是正确的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多