2012-01-16 13 views
5

Oto moja sytuacja: Mam UserBadge obiekt w ASP.NET, zawiera 3 pola, będąc User przedmiotu, Badge obiektu i boolean (isNotified) do sprawdzenia jeśli użytkownik otrzymał powiadomienie o zdobyciu odznaki. Mam problemy z wysyłaniem konkretny UserBadge z tego WebMethod():Pierwsze złożonego obiektu poprzez jQuery/ajax w ASP.NET

[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; 
    } 

do mojego $.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> 

a następnie z powrotem do innego WebMethod() który ustawia isNotified boolean true gdy zawiadomienie jest zamknięty:

[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(); 
       } 
     } 
    } 

Problem: Nie mam absolutnie żadnego pojęcia, jak faktycznie przekazać obiekt do ajax, a następnie z powrotem ... Spędziłem około 1,5 dnia przeglądania Internetu na ten temat, ale teraz, postanowiłem przyjść po pomoc. Im więcej o tym czytam, tym bardziej mnie to denerwuje i jestem absolutnym początkującym użytkownikiem jQuery/Ajax/JSON.

Więc jeśli mógłbyś zachować to tak proste, jak to możliwe, i popchnąć mnie we właściwym kierunku, byłoby to najbardziej cenione!

EDIT: Nowa JavaScript poniżej, myślałem, że mam, ale nie.

EDIT2: To jest teraz rozwiązany, skończyło się za pomocą kontrolera zamiast WebMethods.

Odpowiedz

0

No cóż, w końcu udało mi się to z niewielką pomocą mojego brata i dobrym staroświeckim ćwiczeniem! Rozwiązałem problem za pomocą kontrolera zamiast kodu z opcją WebMethods.

1

Czy na pewno chcesz przekazać obiekt do swojej metody internetowej? Dlaczego nie przekazać identyfikatorów (UserId, badgeId itp.) I Zbuduj obiekt na swojej stronie serwera ajax za pomocą tych identyfikatorów, jeśli to konieczne. Możesz przekazać Id jako wartości ciągu zapytania.

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: Z komentarza, jego jasne, że jest to ASP.NET MVC App

Ponieważ jest to aplikacja ASP.NET MVC, można zrobić modelu wiążące. Możesz serializować swój formularz i wysłać go do akcji kontrolera za pośrednictwem postu jquery.

Jeśli twoja strona ma "LogOnMOdel" i chcesz wykonać to powiązanie również dla obiektu UserBadge, musisz utworzyć inny ViewModel, który ma dwie właściwości, jedną jest LogonModel, a druga to UserBadge. następnie przekaż ten model widoku do swojej strony.

+0

Cóż, o to chodziło, myślałem o tym, ale nie jestem pewien, czy mogę odczytać te identyfikatory z dowolnego miejsca na tej stronie. To mój _Layout.cshtml, więc nie mogę przekazać go innym modelom, aby móc uzyskać te identyfikatory. – mktwo

+0

Czy to jest ASP.NET MVC? Wtedy powinieneś być w stanie wykonać Model Binding dla żądań ajaxowych – Shyju

+0

Tak, to jest MVC3, ale z "Bindowanie modelu dla żądań ajaxowych" masz na myśli, że mogę powiązać model NIE z całą stroną, ale tylko z bitami ajax? Ponieważ powiązanie potrzebnego modelu ze stroną nie jest dla mnie użyteczne, ponieważ strona oczekuje "LogOnModel". – mktwo

5

Chcesz pracować z serializacją JSON. Kiedy zwrócisz wynik do swojej metody wywołania zwrotnego ajax, twoja metoda webowa może zwrócić wynik w postaci XML, JSON lub łańcucha. Jeśli zwrócisz JSON, twój obiekt złożony zostanie przekonwertowany na obiekt Json w bardzo prosty sposób.

Zakładając, że struktura klasowa

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

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

Twój obiekt JSON w JavaScript z funkcją wynik wywołania zwrotnego będzie wyglądać

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

Jak widać, swoją strukturę JSON jest taki sam jak obiektu klasy Struktura. Wywołanie result.UserProperty.Username w javascript jest całkowicie OK. Skonstruowanie tego samego obiektu i przesłanie go do innej usługi ajaxowej spowoduje przekształcenie obiektu JSON w obiekt klasy zarządzanej.

Edytuj: Możesz dodać ScriptMethodAttribute do swojego WebMethod, aby określić odpowiedź JSON.

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

Myślę, że mogę śledzić do tej pory, ale naprawdę nie rozumiem jak działa serializacja JSON, domyślam się, że używam '[Serializable]' dla klasy z 'WebMethod's? – mktwo

+0

Po prostu zwróć obiekt, a program ASP.NET go przekonwertuje. Oto przykład jak wysłać JSON z powrotem do metody internetowej. http://stackoverflow.com/questions/1527422/send-json-to-webmethod –

+0

Zobacz mój Edit for 'ScriptMethod' atrybut do kontrolowania typu odpowiedzi. –

Powiązane problemy