подтвердить имя пользователя ajax и json и asp.net - PullRequest
0 голосов
/ 09 марта 2011

Так что я новичок в json / ajax / jquery / webservices

Я пытаюсь создать страницу присоединения, на которой пользователь вводит несколько букв и получает мгновенный отзыв о том, доступно имя пользователя или нет.

У меня есть html-файл [пользовательский интерфейс] и веб-служба asmx, веб-служба проверяет, существует ли какой-либо полученный текст [он запускает хранимую процедуру, которая работает нормально]

Кажется, мой html-файл не предназначен для вызова моего веб-сервиса.

Я подтвердил, что веб-сервис работает, перейдя на страницу asmx, вручную и введя значение, и он возвращает мне значение true или false.
Одна из проблем заключается в том, что он возвращает его в XML, как показано ниже, вместо json, в котором он находился в

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://localhost">{"available": false}</string>

Итак, к коду / разметке!

Мой HTML-файл

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
        <script type="text/javascript">
    <!--

        $(document).ready(function () {
            var validateUsername = $('#validateUsername');
            $('#username').keyup(function () {
                var t = this;
                if (this.value != this.lastValue) {
                    if (this.timer) clearTimeout(this.timer);
                    validateUsername.removeClass('error').html('<img src="images/ajax-loader.gif" height="16" width="16" /> checking availability...');
                    this.timer = setTimeout(function () {
                        $.ajax({
                            contentType: "application/json; charset=utf-8",
                            url: 'ValidateUser.asmx/GetUsernameAvailable',
                            data: '{username: "'+t.value + '"}',
                            dataType: 'json',
                            type: "post",
                            success: function (j) {
                                validateUsername.html('I willl have my logic in here for changing the html on the label to reflect success or failure!');
                            }
                        });
                    }, 200);

                    this.lastValue = this.value;
                }
            });
        });
//-->
        </script>

</head>
<body>
    <fieldset>
        <div>
                <label for="username">Username, valid: a-z.-_</label>
                <input type="text" name="username" value="" id="username" />
                <span id="validateUsername"></span>
        </div>
    </fieldset>
</body>
</html>

мой файл asmx

<%@ WebService Language="C#" Class="ValidateUser" %>
using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Data;
using System.Data.Odbc;
using System.Web.Script.Serialization;
using System.Web.Script.Services; 
using UserSite.DataClasses;

[WebService(Description = "Web services to query Username availability.", Namespace = "http://localhost")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class ValidateUser: System.Web.Services.WebService
{

    [WebMethod(Description = "Gets the availability of a username.")]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string GetUsernameAvailable(string username)
    {

        if (username == null)
        {
            username = "";
        }
        DbaseExecSpWithReturnValue Sproc = new DbaseExecSpWithReturnValue();
        Sproc.SetSp("sp_CheckUsernameAvailable");
        Sproc.AddParam(1);
        Sproc.AddParam("Username", SqlDbType.Char, username, 20);
        int RetVal = Sproc.Execute();
        Sproc.Close();
        if (RetVal == 0)
        {
            return @"{""available"": false}";
        }
        else
        {
            return @"{""available"": true}";
        }

    }
}

Таким образом, хранимая процедура работает, как я видел, когда я вручную запустил файл asmx, но html-страница не вызывает его, и мой файл asmx не возвращает данные ..... так что в основном это сводит меня с ума!

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Какую версию .NET вы используете - если 3.5, то убедитесь, что у вас есть ScriptHandlerFactory и ScriptModule, зарегистрированные в web.config - они отвечают за обработку запросов JSON.

Вторая проблема связана с фактическойПри реализации службы вы должны вернуть необходимый объект, а инфраструктура ASP.NET будет обрабатывать сериализацию JSON - вам не нужно выводить фактические данные JSON.Например,

public bool GetUsernameAvailable(string username)
{
   ...
   return (RetVal == 0) ? false : true;
}

Выше вернет логическое значение, и вы вызовете доступ к нему в функции вызова как j.d.Например,

...
$ajax({
 ...
 success: function (j) {
    alert(j.d); // will alert either true or false
 }
...

Наконец, переход к конечной точке asmx в браузере вызовет конечную точку мыла, и вы всегда получите XML-запрос-ответ (это потому, что обработчик сценариев ASP.NET будет выполнять сериализацию JSON, только еслизапрос - это запрос POST, а тип контента - JSON).Правильный способ отладки - проверить вызов службы в таком инструменте, как Fiddler.

1 голос
/ 09 марта 2011

Я думаю, что данные вашего ajax-вызова неверны. Согласно документации jquery: Опция данных может содержать либо строку запроса в форме key1 = value1 & key2 = value2, либо карту в форме {key1: 'value1', key2: 'value2'}. Если используется последняя форма, данные перед отправкой преобразуются в строку запроса с помощью jQuery.param (). попробуйте использовать ваш AJAX без отправки даты, чтобы проверить, можете ли вы позвонить WS, затем попробуйте что-то вроде

data :{'username':t.value }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...