【问题标题】:Posting to ASMX Service and returning Object for jQuery发布到 ASMX 服务并为 jQuery 返回对象
【发布时间】:2010-08-21 01:46:39
【问题描述】:

我正在使用 fluent NHibernate 和 WebForms,我正在尝试构建一个页面,允许用户在他们的个人资料页面上发布状态更新,我使用 .asmx WebService 将数据发布到数据库然后返回jQuery 要使用的页面的 StatusUpdate 实例。我有几个问题。

1) 首先,当我从 WebService(我正在测试)返回一个字符串时,用户输入其状态的文本框不会清空内容。而且由于即使我手动清除文本框并放入其他内容,页面也不会刷新,它仍然会再次将先前的状态发布到数据库。我该如何解决这个问题?

2) 其次,当我从 Web 服务返回 StatusUpdate 对象时,我无法显示任何结果。我很伤心,我使用 jQuery 对 WebService 进行 AJX 调用。

这是我的代码:

用户个人资料页面 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(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 页试图找到答案,但没有一个有效..

【问题讨论】:

    标签: asp.net web-services jquery asmx


    【解决方案1】:

    对于 #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 Web 服务喜欢包装对象,所以它看起来像这样:

    { "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);
    

    【讨论】:

    • 你确实修复了我忘记提到的一件事,将 .val) 调用放在函数中。这完全是我的疏忽。非常感谢.. 现在我仍然有一个问题,当我将更新发布到数据库并返回对象时,他的新状态不会显示在状态区域中。它仍然显示旧的。可能是什么原因造成的?那是我现在剩下的唯一问题。再次感谢您的帮助..
    • Nm.. 我终于想通了... LOL 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多