1

我有一个 jquery ajax 调用 asp.net 网络服务问题。我想验证 asp.net 网页中的文本框。验证器是:

<asp:CustomValidator ID="CustomValidatorUser" runat="server" ControlToValidate="TextUserName"
                                ErrorMessage="Minimum of 6 (six) alphanumeric characters." 
                 ClientValidationFunction="ValidateUserName" Display="Dynamic"
                                ValidateEmptyText="True" ></asp:CustomValidator>

jquery 代码是(更新的第 2 次):

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<script src="../jquery-1.7.2.min.js" type="text/javascript"></script>
<script>
$.ajax({
    type: "POST",
    url: "UserNameWebService.asmx/ValidateUserName",
    data: "{'strUsername': " + $("#TextUserName").val() + "}",
    contentType: "application/json; charset=utf-8",
    dataType: "json"
});
</script>
<div>
    General user information</div>
<p>
</p>
<table cellpadding="2">

网络服务代码为:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
 [System.Web.Script.Services.ScriptService]
public class UserNameWebService : System.Web.Services.WebService
{

    [WebMethod]
     public bool ValidateUserName(string strUsername)
    {
        string UserNameCreated = strUsername;
        string AD_Server = System.Configuration.ConfigurationManager.AppSettings["AD_Server"];
        DirectoryEntry entry = new DirectoryEntry(AD_Server);
        entry.AuthenticationType = AuthenticationTypes.Secure;

        DirectorySearcher deSearch = new DirectorySearcher(entry);
        deSearch.Filter = "(&(objectClass=user)(samaccountname=" + UserNameCreated + "))";

        SearchResultCollection results = deSearch.FindAll();
        Match match = Regex.Match(UserNameCreated, @"^[a-zA-Z0-9]{6,}$", RegexOptions.IgnoreCase);
        if (results.Count > 0)
            return false;
        else if (match.Success)
            return true;
        else
            return false;
    }    }

但我得到一个错误:

ValidateUserName is undefined.

请帮我纠正错误。

非常感谢你!

4

2 回答 2

1

您需要将 ajax 函数封装在函数调用中ValidateUserName,以便匹配ClientValidationFunction.

function ValidateUserName(){
  $.ajax({
    type: "POST",
    url: "UserNameWebService.asmx/ValidateUserName",
    data: "{'strUsername': " + $("#TextUserName").val() + "}",
    contentType: "application/json; charset=utf-8",
    dataType: "json"
  });
}

即使那样,这也没有返回值。我认为您需要使用success该函数的选项$.ajax来设置一个布尔值以返回该函数。

所以你会做这样的事情:

function ValidateUserName(){
   var isValid;
   $.ajax({
    type: "POST",
    url: "UserNameWebService.asmx/ValidateUserName",
    data: "{'strUsername': '" + $("#TextUserName").val() + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json"
    , async: false
    , success: function(data){
       isValid = data;
    }
  });
  return isValid;
}

请注意,我也设置async为 false。

于 2012-04-21T00:28:16.703 回答
1

您的代码实际上存在几个问题。

1)$("#TextUserName")在这种情况下不起作用,因为 asp.net 将TextBox使用不同的 ID 呈现服务器端控件。您需要这样做:

data: "{'strUsername': " + $("#<%=TextUserName.ClientID%>").val() + "}",

2)数据属性中的 json 格式不正确,您需要'在值周围加上单引号,如下所示:

                       |                                              | 
                       V                                              V
data: "{'strUsername': '" + $("#<%=TextUserName.ClientID%>").val() + "'}",

3)您需要将您的 Jquery ajax 调用放在一个函数中,在您的情况下,该函数称为ValidateUserName. 它有两个参数sourceargs。此函数的职责是将 的值设置args.IsValidtruefalse。因此,您需要提供一个在 ajax 调用成功时调用的函数,该函数可以执行此逻辑。像这样:

function ValidateUserName(source, args) {
    $.ajax({
        type: "POST",
        url: "UserNameWebService.asmx/ValidateUserName",
        data: "{'strUsername': '" + args.Value + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: false,
        success: function (result) {
            args.IsValid = result.d;
        }
    });
}

4) 正如您在上面的代码中所看到的,您实际上不需要使用 jquery 从文本框中获取值,因为您可以像这样访问它args.Value

5)你需要添加async: false,否则到设置的时间IsValid,设置消息可见性的代码已经执行,所以什么都不会发生。

于 2012-04-21T00:55:54.480 回答