2012-01-16 70 views
5

這裏是我的情況:我有在ASP.NET一個UserBadge對象,它包含了3場,是一個User對象,Badge對象和boolean(isNotified)檢查如果用戶已被通知獲得徽章。我是從這個WebMethod()有發送特定UserBadge問題:在ASP.NET得到一個複雜的對象通過的jQuery/AJAX

[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,以爲我有它,但我沒有。

編輯2: 這現在解決了,我最終使用控制器而不是WebMethods

回答

0

那麼,最後通過我的兄弟和一些很好的老式練習的一點點幫助搞清楚了!我使用控制器代替WebMethods來解決這個問題。

1

你真的想把對象傳遞給你的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 

編輯:從評論中,其明確表示,它是一個ASP.NET MVC應用程序

因爲它是一個ASP.NET MVC應用程序,你可以做模型綁定。你可以序列化你的表單並通過jquery post發送給控制器動作。

如果你的頁面有一個「LogOnMOdel」並且你想爲UserBadge對象做這個綁定,你需要創建另一個ViewModel,它有兩個屬性,一個是LogonModel,另一個是UserBadge。然後將該視圖模型傳遞給您的頁面。

+0

嗯,就是這樣,我想到了這一點,但我不確定我能從該頁面的任何位置閱讀這些Ids。這是我的_Layout.cshtml,所以我不能通過它一個不同的模型,以達到這些ID。 – mktwo 2012-01-16 14:20:30

+0

這是ASP.NET MVC?那麼你應該可以爲AJAX請求做模型綁定 – Shyju 2012-01-16 14:23:19

+0

是的,這是MVC3,但是'模型綁定的Ajax請求',你的意思是我可以綁定一個模型不是整個頁面,而只是ajax位?因爲將所需的模型綁定到頁面對我來說並不是真的可用,因爲頁面期望有一個'LogOnModel'。 – mktwo 2012-01-16 14:33:57

5

你想使用JSON序列化。當您將結果返回給您的ajax回調方法時,您的web方法可以以XML,JSON或字符串的形式返回結果。如果你返回一個JSON,你的複雜對象將以非常直接的方式轉換爲一個json對象。

假設你的類結構,從結果的回調函數的JavaScript

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

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

您的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() 
{ 
} 
+0

我認爲我可以追隨到目前爲止,但我真的不知道如何JSON序列化的作品,我猜我使用'[Serializable]'類用'WebMethod's? – mktwo 2012-01-16 14:32:07

+0

只需返回對象,ASP.NET就會爲您轉換它。以下是如何將JSON發送回Web方法的示例。 http://stackoverflow.com/questions/1527422/send-json-to-webmethod – 2012-01-16 14:40:06

+0

請參閱我的Edit for ScriptMethod屬性來控制響應類型。 – 2012-01-16 14:43:22

相關問題