2013-08-15 44 views
36

Tôi không thể lấy cách tôi có thể trả về dữ liệu JSON bằng mã của mình.Làm thế nào để trả về JSON với ASP.NET & jQuery

JS

$(function() { 
$.ajax({ 
     type: "POST", 
     url: "Default.aspx/GetProducts", 
     data: "{}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (msg) { 
      // How to return data here like a table??? 
      $("#Second").text(msg.d); 
      //alert(msg.d); 
     } 
    }); 
}); 

C# của Default.aspx.cs

[WebMethod] 
public static string GetProducts() 
{ 
    var products = context.GetProducts().ToList(); 
    return What do I have to return ???? 
} 

Cảm ơn trước!

+1

tại sao bạn không sử dụng api web? –

+2

Thử lớp 'JavaScriptSerializer'. –

+0

Hãy xem câu hỏi này: http://stackoverflow.com/questions/8405458/return-json-data-from-asmx-web-service Về cơ bản, bạn cần phải trả về một chuỗi json và cho rằng, bạn cần phải sử dụng JavaScriptSerializer để tuần tự hóa các đối tượng/danh sách C# thành các chuỗi json. Bạn không xa. – frenchie

Trả lời

37

Bạn' không xa; bạn cần phải làm điều gì đó như thế này:

[WebMethod] 
public static string GetProducts() 
{ 
    // instantiate a serializer 
    JavaScriptSerializer TheSerializer = new JavaScriptSerializer(); 

    //optional: you can create your own custom converter 
    TheSerializer.RegisterConverters(new JavaScriptConverter[] {new MyCustomJson()}); 

    var products = context.GetProducts().ToList(); 

    var TheJson = TheSerializer.Serialize(products); 

    return TheJson; 
} 

Bạn có thể giảm mã này thêm nhưng tôi để nó như vậy để rõ ràng. Trong thực tế, bạn thậm chí có thể viết điều này:

return context.GetProducts().ToList(); 

và điều này sẽ trả về một chuỗi json. Tôi thích rõ ràng hơn vì tôi sử dụng trình chuyển đổi tùy chỉnh. Ngoài ra còn có Json.net nhưng khuôn khổ của JavaScriptSerializer hoạt động tốt ra khỏi hộp.

+5

bạn cũng có thể thêm phần này vào đầu 'phương thức tĩnh' của bạn với' JavaScriptSerializer' '[ScriptMethod (Sử dụngHttpGet = true, ResponseFormat = ResponseFormat.Json)]' –

+1

'MyCustomJson' nghĩa là gì ở đây? Bạn có thể cung cấp một liên kết đến một ví dụ không? Tôi tự hỏi có bao nhiêu mã hóa thủ công là cần thiết cho một lớp nhất định. –

+1

Nếu bạn không có bộ chuyển đổi tùy chỉnh, bộ nối tiếp sẽ tuần tự hóa/deserialize đối tượng C# của bạn thành json với cùng tên thuộc tính. Nhưng nếu bạn muốn đối tượng javascript của bạn khác với đối tượng C# hoặc muốn bao gồm một số quy tắc xác thực khi bạn deserialize, thì bạn cần một công cụ chuyển đổi tùy chỉnh. Dưới đây là một số câu hỏi tôi đã hỏi về điều đó: http://stackoverflow.com/questions/4998595/serializing-only-parts-of-an-object-with-json http://stackoverflow.com/questions/10193024/nested- json-custom-converter-in-c-sharp-với-javascriptconverter – frenchie

2

Asp.net khá tốt khi tự động chuyển đổi các đối tượng .net thành json. Đối tượng List của bạn nếu được trả về trong webmethod của bạn sẽ trả về một mảng json/javascript. Ý tôi là, bạn không nên thay đổi kiểu trả về thành chuỗi (vì đó là những gì bạn nghĩ rằng máy khách đang mong đợi) khi trả về dữ liệu từ một phương thức. Nếu bạn trả về một mảng .net từ một webmethod một mảng javaScript sẽ được trả về cho máy khách. Nó không thực sự hoạt động tốt cho các đối tượng phức tạp hơn, nhưng đối với dữ liệu mảng đơn giản thì nó vẫn ổn.

Tất nhiên, bạn có thể làm những gì bạn cần làm ở phía khách hàng.

tôi sẽ suy nghĩ một cái gì đó như thế này:

[WebMethod] 
public static List GetProducts() 
{ 
    var products = context.GetProducts().ToList(); 
    return products; 
} 

Có nên không thực sự có bất kỳ cần phải khởi tạo bất kỳ chuyển đổi tùy chỉnh trừ khi dữ liệu của bạn là phức tạp hơn dữ liệu hàng/col đơn giản

-6

Cố gắng sử dụng này, nó hoạt động hoàn hảo cho tôi

// 

    varb = new List<object>(); 

// Example 

    varb.Add(new[] { float.Parse(GridView1.Rows[1].Cells[2].Text)}); 

// JSON + Serializ 

public string Json() 
     { 
      return (new JavaScriptSerializer()).Serialize(varb); 
     } 


// Jquery SIDE 

    var datasets = { 
      "Products": { 
       label: "Products", 
       data: <%= getJson() %> 
      } 
5

Cấu trúc này làm việc cho tôi - tôi đã sử dụng nó trong một ứng dụng quản lý nhiệm vụ nhỏ.

Bộ điều khiển:

public JsonResult taskCount(string fDate) 
{ 
    // do some stuff based on the date 

    // totalTasks is a count of the things I need to do today 
    // tasksDone is a count of the tasks I actually did 
    // pcDone is the percentage of tasks done 

    return Json(new { 
    totalTasks = totalTasks, 
    tasksDone = tasksDone, 
    percentDone = pcDone 
    }); 
} 

Trong cuộc gọi AJAX tôi truy cập các dữ liệu như thế này:

.done(function (data) { 
    // data.totalTasks 
    // data.tasksDone 
    // data.percentDone 
}); 
11

Chỉ cần quay trở lại đối tượng: nó sẽ được phân tích cú pháp để JSON.

public Object Get(string id) 
{ 
    return new { id = 1234 }; 
} 
+0

Rất ngắn và ngọt ! Ý tưởng tuyệt vời. –

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