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

时间:2012-01-16 14:09:42

标签: c# jquery asp.net ajax json

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

[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 boolean设置为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,我以为我有,但我没有。

EDIT2: 现在解决了这个问题,我最终使用的是控制器而不是WebMethods

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

您真的想将对象传递给您的网络方法吗?为什么不传递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

编辑:从评论中明确表示它是一个ASP.NET MVC应用程序

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

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

答案 2 :(得分:0)

好吧,终于在我兄弟的帮助和一些老式的锻炼中找到了它!我通过使用控制器而不是WebMethods的代码隐藏来解决了这个问题。