コードでJSONデータを返す方法を取得できません。
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#of Default.aspx.cs
[WebMethod]
public static string GetProducts()
{
var products = context.GetProducts().ToList();
return What do I have to return ????
}
前もって感謝します!
あなたは遠くありません。次のようなことをする必要があります。
[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;
}
このコードはさらに減らすことができますが、わかりやすくするためにそのままにしておきました。実際、次のように書くこともできます。
return context.GetProducts().ToList();
そして、これはJSON文字列を返します。カスタムコンバーターを使用しているため、より明示的にすることを好みます。 Json.netもありますが、フレームワークのJavaScriptSerializer
はそのまま使用できます。
オブジェクトを返すだけで、JSONのパーサーになります。
public Object Get(string id)
{
return new { id = 1234 };
}
この構造は私のために機能します-私は小さなタスク管理アプリケーションでそれを使用しました。
コントローラー:
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
});
}
AJAX呼び出しで、次のようにデータにアクセスします。
.done(function (data) {
// data.totalTasks
// data.tasksDone
// data.percentDone
});
Asp.netは、.netオブジェクトをjsonに自動的に変換するのに非常に優れています。 Listメソッドは、webmethodで返される場合、json/javascript配列を返す必要があります。これが意味することは、メソッドからデータを返すときに、戻り値の型を文字列に変更すべきではないということです(これはクライアントが期待していることだからです)。 webmethodから.net配列を返す場合、javaScript配列がクライアントに返されます。実際には、より複雑なオブジェクトにはあまり効果的ではありませんが、単純な配列データには適しています。
もちろん、クライアント側で必要なことを行うのはあなた次第です。
私はこのようなことを考えています:
[WebMethod]
public static List GetProducts()
{
var products = context.GetProducts().ToList();
return products;
}
データが単純な行/列データよりも複雑でない限り、実際にカスタムコンバーターを初期化する必要はないはずです。