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

本文关键字:ajax 获取 复杂 对象 jQuery ASP NET | 更新日期: 2023-09-27 18:20:21

我的情况是:我在ASP.NET中有一个UserBadge对象,它包含3个字段,分别是User对象、Badge对象和boolean(isNotificationd),用于检查用户是否已收到获得徽章的通知。我从这个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>

然后返回到另一个CCD_ 8,该CCD_

    [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版:现在这个问题已经解决了,我最终使用了一个控制器而不是WebMethods

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

您希望使用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()
{
}

您真的想将对象传递给您的web方法吗?如果需要的话,为什么不传递Id(UserId、badgeId等)并使用这些Id在ajax服务器页面中构建对象呢。您可以将Id作为查询字符串值进行传递。

var userId=4 // read from some hidden items or somewhere
var badgeid=3 // read from somewhere
$.ajax({
        type: "POST",
        url: "../NotifCodeBehind.aspx/Notify?uid="+userId+"&bid="+badgeId,
        data: "{}",
        complete: function (result) {
       // rest of the code

EDIT:从评论中可以清楚地看出,它是一个ASP.NET MVC应用程序

由于它是一个ASP.NET MVC应用程序,因此可以进行模型绑定。您可以序列化您的表单,并通过jquerypost将其发送到控制器操作。

如果您的页面有一个"LogOnMOdel",并且您也想为UserBadge对象执行此绑定,则需要创建另一个具有两个属性的ViewModel,一个是LogOnMOdel,另一个是UserBadge。然后将该视图模型传递到您的页面。

在我哥哥的帮助下,通过一些老式的锻炼,终于找到了答案!我通过使用控制器而不是WebMethods的代码隐藏来解决这个问题。