2012-01-16 36 views
5

Đây là tình huống của tôi: Tôi có đối tượng UserBadge trong ASP.NET, nó chứa 3 trường, là đối tượng User, đối tượng Badgeboolean (isNotified) để kiểm tra nếu người dùng đã được thông báo về việc giành được huy hiệu. Tôi đang gặp vấn đề gửi một cụ UserBadge từ WebMethod() này:Nhận đối tượng phức tạp thông qua jQuery/ajax trong 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; 
    } 

để $.ajax tôi:

<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> 

và sau đó trở lại khác WebMethod() mà đặt isNotified boolean true khi thông báo đã bị đóng:

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

Sự cố: Tôi hoàn toàn không có ý tưởng làm thế nào để thực sự vượt qua đối tượng để ajax, và sau đó trở lại một lần nữa ... Tôi đã dành khoảng 1,5 ngày duyệt internet về nó, nhưng bây giờ, tôi đã quyết định đến để được giúp đỡ. Tôi càng đọc nhiều về nó, nó càng làm tôi bối rối, và tôi là một người mới tuyệt đối đối với jQuery/Ajax/JSON.

Vì vậy, nếu bạn có thể giữ nó đơn giản nhất có thể, và di chuyển tôi theo đúng hướng, nó sẽ được đánh giá cao nhất!

CHỈNH SỬA: JavaScript mới bên dưới, tôi nghĩ là đã có, nhưng tôi thì không.

EDIT2: Điều này hiện được giải quyết, tôi đã sử dụng bộ điều khiển thay vì WebMethods.

Trả lời

0

Vâng, cuối cùng đã tìm ra được một chút trợ giúp từ anh tôi và một số bài tập thời trang cũ tốt! Tôi giải quyết vấn đề bằng cách sử dụng một bộ điều khiển thay vì một mã phía sau với WebMethods.

1

Bạn có thực sự muốn chuyển đối tượng đến phương pháp web của mình không? Tại sao không vượt qua các id (UserId, badgeId vv) và xây dựng các đối tượng trong trang máy chủ ajax của bạn bằng cách sử dụng những ID nếu cần thiết. Bạn có thể chuyển Id làm giá trị chuỗi truy vấn.

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: Từ Comment, nó rõ ràng rằng nó là một ASP.NET MVC App

Vì nó là một ứng dụng ASP.NET MVC, Bạn có thể làm mô hình ràng buộc. Bạn có thể tuần tự hóa biểu mẫu của mình và gửi biểu mẫu đó đến hành động điều khiển qua bài đăng jquery.

Nếu trang của bạn đang có một "LogOnMOdel" và bạn muốn làm điều này ràng buộc cho đối tượng UserBadge, bạn cần tạo một ViewModel khác có 2 thuộc tính, một là LogonModel và một là UserBadge. sau đó chuyển mô hình xem đó tới trang của bạn.

+0

Vâng, đó là điều tôi nghĩ về điều đó, nhưng tôi không chắc là tôi có thể đọc những Ids từ bất cứ nơi nào trên trang đó. Đó là _Layout.cshtml của tôi vì vậy tôi không thể chuyển cho nó một mô hình khác để có thể truy cập vào các Id đó. – mktwo

+0

Đây có phải là ASP.NET MVC không? Sau đó, bạn sẽ có thể làm Model Binding cho các yêu cầu ajax – Shyju

+0

Vâng, đây là MVC3, nhưng với 'Mô hình ràng buộc cho các yêu cầu ajax', bạn có nghĩa là tôi có thể liên kết một mô hình KHÔNG với toàn bộ trang, nhưng chỉ với các bit ajax? Bởi vì ràng buộc mô hình cần thiết cho trang không thực sự có thể sử dụng được cho tôi, bởi vì trang mong đợi một 'LogOnModel'. – mktwo

5

Bạn muốn làm việc với tuần tự hóa JSON. Khi bạn trả về kết quả cho phương thức gọi lại ajax, phương thức web của bạn có thể trả về kết quả dưới dạng XML, JSON hoặc chuỗi. Nếu bạn trả về một JSON, đối tượng phức tạp của bạn sẽ được chuyển đổi thành một đối tượng json theo cách rất thẳng.

Giả sử cấu trúc lớp học của bạn

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

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

đối tượng json của bạn trong javascript từ chức năng kết quả callback sẽ trông giống như

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

Như bạn thấy, cấu trúc JSON của bạn cũng giống như đối tượng lớp học của bạn kết cấu. Vì vậy, hãy gọi result.UserProperty.Username trong javascript là hoàn toàn ổn. Việc xây dựng cùng một đối tượng và chuyển nó tới một dịch vụ web ajax khác sẽ chuyển đối tượng JSON thành các đối tượng lớp được quản lý.

Chỉnh sửa: Bạn có thể thêm ScriptMethodAttribute để WebMethod của bạn để xác định JSON phản ứng.

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

tôi nghĩ rằng tôi có thể làm theo cho đến nay, nhưng tôi thực sự không hiểu cách thức hoạt động serialization JSON, tôi đoán tôi sử dụng '[Serializable]' cho lớp với 'WebMethod's? – mktwo

+0

Đơn giản chỉ cần trả về đối tượng và ASP.NET sẽ chuyển đổi nó cho bạn. Dưới đây là một ví dụ về cách gửi JSON trở lại phương thức web. http://stackoverflow.com/questions/1527422/send-json-to-webmethod –

+0

Xem Chỉnh sửa của tôi cho thuộc tính 'ScriptMethod' để kiểm soát loại phản hồi. –

Các vấn đề liên quan