【问题标题】:Getting a complex object through jQuery/ajax in ASP.NET在 ASP.NET 中通过 jQuery/ajax 获取复杂对象
【发布时间】:2012-02-11 11:06:15
【问题描述】:

这是我的情况:我在 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 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

【问题讨论】:

    标签: c# jquery asp.net ajax json


    【解决方案1】:

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

    【讨论】:

    • 我想我可以跟随到目前为止,但我真的不明白 JSON 序列化是如何工作的,我猜我使用 [Serializable]WebMethods 的类?
    • 只需返回对象,ASP.NET 就会为您转换它。这是一个如何将 JSON 发送回 Web 方法的示例。 stackoverflow.com/questions/1527422/send-json-to-webmethod
    • 查看我的编辑ScriptMethod 属性以控制响应类型。
    【解决方案2】:

    您真的想将对象传递给您的网络方法吗?为什么不传递 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。然后将该视图模型传递给您的页面。

    【讨论】:

    • 嗯,就是这样,我想过,但我不确定我是否可以从该页面上的任何位置读取这些 ID。这是我的 _Layout.cshtml,所以我不能通过不同的模型来获取这些 ID。
    • 这是 ASP.NET MVC 吗?然后你应该能够为 ajax 请求做模型绑定
    • 是的,这是 MVC3,但是使用“用于 ajax 请求的模型绑定”,你的意思是我可以将模型绑定到整个页面,而只能绑定到 ajax 位?因为将所需的模型绑定到页面对我来说并不真正可用,因为页面需要LogOnModel
    • 我已经制作了一个 ViewModel,但是如何将 LogOnModel 传递给页面?
    • 澄清:如何将 LogOnModel 从 ViewModel 传递给 @Html.Partial("_LogonPartial")?我试图让它 @Html.Partial("_LogonPartial", Model.LogOnModel) 但是当我加载页面时它说引用没有设置为对象的实例..
    【解决方案3】:

    好吧,在我兄弟的一点帮助和一些老式的练习下,终于弄明白了!我通过使用控制器而不是 WebMethods 的代码隐藏解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      相关资源
      最近更新 更多