任何人都可以告诉我如何让ASP.NET WebMethod返回正确格式的数据以供jQuery Validate显示?这是我的代码:
$('#txtUName').rules('add', {
remote: {
type: 'POST',
url: 'Register.aspx/ValidateUserNameOrEmail',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({
'data' : $('#txtUName').val(),
'valUser' : true
}),
dataFilter: function(result) {
return $.parseJSON(result).d;
},
dataType: 'json'
}
});
[WebMethod]
public static object ValidateUserNameOrEmail(string data, bool valUser)
{
var col = valUser ? "userName" : "email";
var label = valUser ? "username" : "email address";
using (var conn = new SqlConnection(dbConn))
using (var comm = new SqlCommand("", conn))
{
conn.Open();
comm.CommandText = "SELECT userId FROM [dbo]." +
"[User] WHERE " + col + " = '" + data + "'";
if (comm.ExecuteScalar() != null)
{
// Entered username or email already exists in the DB
return "A user with that " + label + " already " +
"exists. Please enter a unique " + label + ".";
}
}
return true;
}
tl; dr - 我是否应该放弃这个假设才能正常工作,并使用自定义远程消息?这应该有效,因为我可以看到,当用户名已被占用时,肯定会从稍后调用element.valid()
返回false。但我真的想避免在可能的情况下指定自定义消息。
编辑:确实上面的解决方案有效,所以我现在就会使用它,但如果可以,请继续阅读并提出更好的解决方案!
单步执行这两段代码,我可以看到所有内容都被调用并返回奇妙,但jQuery Validate只是拒绝显示该死的错误!
响应被评估为JSON,对于有效元素必须为true,并且对于无效元素,可以是任何false,undefined或null,使用默认消息; 或字符串,例如。 “该名称已被采用,请尝试使用peter123”显示为错误消息。
那么我做错了什么?正如您可以清楚地看到的那样,我在成功的情况下返回true或者在其他情况下返回相应的错误消息字符串,就像文档说我应该的那样(很好看;见下文)。
根据这些文档和Asp.Net WebForm JQuery remote Validation,我应该从服务器返回一个JSON对象,但是当我在客户端将其解析为JSON时,我看不出这会有什么不同,徒劳无功。我会尝试在Jeff Siver的评论中提出的解决方案,但我猜这是针对MVC的,因为我的系统上不存在Sys
命名空间。
在这两个帖子之后我放弃了建议的StackOverflow帖子......我的情况似乎与他们所有人的情况非常不同。
编辑@Sparky - 嗨,谢谢你的回复。我链接的第一篇文章确实提到使用JavaScriptSerializer
类以正确的格式返回数据,所以我很抱歉没有看到更早的数据。但是,这不是您链接的答案。你联系到的答案(以及我读到的)提到了一些未知的Json
类......正如Melursus所说:
你能给我一个如何返回JSON对象的例子,因为我找不到这个命名空间。我也没有找到ActionResult命名空间。所以,我不明白我如何使用建议的解决方案。
我最初看到并停止阅读,但您的评论促使我做进一步的研究,并找到可能真正起作用的JavaScriptSerializer
解决方案。我会试一试让你知道: - )