c# - 在 ASP.NET 中通过 jQuery/ajax 获取复杂对象

标签 c# jquery asp.net ajax json

这是我的情况:我在 ASP.NET 中有一个 UserBadge 对象,它包含 3 个字段,一个是 User 对象,一个是 Badge对象和一个 boolean (isNotified) 以检查用户是否已收到获得徽章的通知。我在从此 WebMethod() 发送特定 UserBadge 时遇到问题:

[WebMethod()]
    public static UserBadge Notify()
    {
        var db = new achievDb();

        foreach (var uB in db.UserBadges)
        {
            if (System.Web.HttpContext.Current.User.Identity.Name == uB.User.UserName)
            {
                if (!uB.isNotified)
                {
                    return uB;
                }
            }
        }
        return null;
    }

到我的$.ajax:

<script type="text/javascript">
            $(document).ready(function () {
                $.ajax({
                    type: "POST",
                    url: "../NotifCodeBehind.aspx/Notify",
                    data: "{}",
                    complete: function (result) {
                        if (result) {
                            $("#notify").jGrowl("You've unlocked a badge!", { header: 'Yay', close: function () {
                                $.ajax({
                                    type: "POST",
                                    url: "../NotifCodeBehind.aspx/Notified",
                                    data: "{}",
                                    success: function (ub) { DoCallback(JSON.stringify(ub)); },
                                    error: function () { DoCallback("NOPE!") }
                                });
                            }
                            })

                        };
                        function DoCallback(msg) {
                            alert(msg);
                        }
                    }
                })
            })
        </script>

然后返回到另一个 WebMethod(),它在通知关闭后将 isNotified bool 值 设置为 true:

    [WebMethod()]
    public static void Notified(UserBadge ub)
    {
        var db = new achievDb();

            foreach (var userbadge in db.UserBadges)
            {
                if (userbadge.UserId == ub.UserId && userbadge.BadgeId == ub.UserId)
                {
                    userbadge.isNotified = true;
                    db.SaveChanges();
                }
        }
    }

问题: 我完全不知道如何将对象实际传递给 ajax,然后再返回……我花了大约 1.5 天浏览互联网,但现在,我决定寻求帮助。我对它的了解越多,就越让我感到困惑,而且我绝对是 jQuery/Ajax/JSON 的新手。

因此,如果您能让它尽可能简单,并在正确的方向上插入我,我们将不胜感激!

编辑: 下面的新 JavaScript,我以为我有,但我没有。

编辑 2: 现在已经解决了,我最终使用了 Controller 而不是 WebMethods

最佳答案

您想使用 JSON 序列化。当您将结果返回给您的 ajax 回调方法时,您的 Web 方法可以 XML、JSON 或字符串的形式返回结果。如果您返回 JSON,您的复杂对象将以非常直接的方式转换为 json 对象。

假设你的类结构

class UserBadge
{
    User UserProperty { get; set; }
    Badge BadgeProperty { get; set; }
    bool IsNotified { get; set; }
}

class User
{
    string Username { get; set; }
}

结果回调函数中的 javascript 中的 json 对象将如下所示

{ 
  UserProperty: { Username: "some username" },
  BadgeProperty: { /**********/ },
  IsNotified: true 
}

如您所见,您的 JSON 结构与您的类对象结构相同。 因此,在 javascript 中调用 result.UserProperty.Username 是完全可以的。 构造相同的对象并将其传递给另一个 ajax Web 服务会将 JSON 对象转换为托管类对象。

编辑:您可以添加 ScriptMethodAttribute到您的 WebMethod 以指定 JSON 响应。

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static UserBadge Notify()
{
}

关于c# - 在 ASP.NET 中通过 jQuery/ajax 获取复杂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8881170/

相关文章:

jquery - 如何使用 jQuery 查找数组中的项目?

围绕非托管 DLL 的 C# 包装器库要求在构建期间非托管 DLL 位于同一目录中

c# - Entity Framework 按时间过滤数据

php - ajax请求后获取json中的值

jquery - 在 jQuery 中,我如何将左对齐样式附加到所有元素?

c# - 更改成员资格、角色等的默认连接字符串

c# - 如何从客户端保护密码?是否需要或 HTTPS/SSL 就足够了?

c# - .NET 线程问题

c# - 如何使用过滤器从 EntityDataSource 填充可更新的 FormView

javascript - sumoselect 多个下拉列表在页面加载时闪烁