Публикация в ASMX Service и возврат Object для jQuery - PullRequest
1 голос
/ 21 августа 2010

Я свободно использую NHibernate с WebForms и пытаюсь создать страницу, на которой я разрешаю пользователю публиковать обновление статуса на странице своего профиля, а я использую .asmx WebService для публикации данных в базе данных, а затем возвращаю экземпляр StatusUpdate для страницы, которая будет использоваться jQuery. У меня пара проблем.

1) Прежде всего, когда я возвращаю строку из WebService (я тестировал), текстовое поле, в которое пользователь вводит свой статус, не очищает содержимое. И поскольку страница не обновляется, даже если я вручную очищаю текстовое поле и вставляю что-то еще, она все равно снова передает прежний статус в базу данных. Как мне это исправить?

2) Во-вторых, когда я возвращаю объект StatusUpdate из веб-службы, я не могу отобразить результаты. Как мне грустно, я использую jQuery для вызова AJX в WebService.

Вот мой код:

Страница профиля пользователя Javascript:

    var status1 = $("#statusBox").val();
    var userID = $("#MainContent_userID").val();
    function SetStatus() {
        $.ajax({
            type: "POST",
            url: "http://localhost/Sports/Services/UserWebService.asmx/SetStatus",
            data: '{"status": "' + status1 + '", "userID": "' + userID + '"}',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: OnSuccess,
            error: OnError
        });
    }
    function OnSuccess(response) {
        $("#statusBox").empty();
                $("#MainContent_status").html(response.Status).fadeIn(1000);  
            }

    function OnError(request, status, error) {
                alert(request.statusText);
            }

WebService:

[WebService(Namespace = "Sports.Services")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)] 
[System.Web.Script.Services.ScriptService]
public class UserWebService : System.Web.Services.WebService
{
    private IUserSession _userSession;
    public ISession Session1
    {
        get { return NHibernateSessionModule.GetCurrentSession(); }
    } 

    [WebMethod]
    public StatusUpdate SetStatus(string status, Guid userID)
    {
        _userSession = ObjectFactory.GetInstance<IUserSession>();
        StatusUpdate update = new StatusUpdate();
        update.StatusDateTime = DateTime.Now;
        update.StatusLikes = 0;
        update.UserID = userID;
        update.Status = status;
        Session1.SaveOrUpdate(update);
        return update;
    }
}

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

1 Ответ

5 голосов
/ 21 августа 2010

Для # 1 вам нужно переместить вызовы .val() внутри метода, чтобы они выбирались в нужное время, например:

function SetStatus() {
    var status1 = $("#statusBox").val();
    var userID = $("#MainContent_userID").val();
    $.ajax({
        type: "POST",
        url: "http://localhost/Sports/Services/UserWebService.asmx/SetStatus",
        data: '{"status": "' + status1 + '", "userID": "' + userID + '"}',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: OnSuccess,
        error: OnError
    });
}

Хотя вам следуетрассмотрите возможность создания объекта в виде объекта и использования .stringify для обработки любых специальных символов.


Для # 2 веб-сервисы asmx любят оборачивать объект, поэтому не выглядит так:

{ "Status": "My Status", "UserID": 12, "StatusLikes": 0..... }

На самом деле это выглядит так:

{ "d": { "Status": "My Status", "UserID": 12, "StatusLikes": 0..... } }

Так что вместо этого:

$("#MainContent_status").html(response.Status).fadeIn(1000);

Вам нужноэто:

$("#MainContent_status").html(response.d.Status).fadeIn(1000);
...