web-dev-qa-db-ja.com

標準のWebフォーム.NetでJSONオブジェクトを返す方法

目的は、それを実行するメソッドを呼び出し、JSONオブジェクトを返すことです。

JSONは初めてです。

私はdefault.aspxを持ち、その中に次のコードがあります。ここで、Default.aspx.csの通常のメソッドがここのクリックイベントで実行されるようにします。

$(".day").click(function (event) {
var day = $(event.currentTarget).attr('id');
if (day != "") {
    $.ajax(
    {
        type: "POST",
        async: true,
        url: 'Default.aspx?day=' + day,
        data: day,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            console.log("SUCCESS:" + msg);
            //  $(".stripp img").attr('src', "data:image/jpg;" + msg);
            //  $(".stripp").show();
        },
        error: function (msg) {
            console.log("error:" + msg);
        }
    });
}

});

Default.aspx.csは次のようになります。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString["day"] != null)
            GetFile(Request.QueryString["day"]);
    }
    public string GetFile(string day)
    {
        string json = "";
        byte[] bytes = getByteArray();

        json = JsonConvert.SerializeObject(bytes);
        return json;
    }

ここでどこがいけないのですか?これを何らかの方法で使用する必要がありますか、それともWebサービスにのみ適用できますか?

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
17

HttpHandlerをお勧めします。ページのライフサイクルがなく(非常に高速であるため)、コードの分離がより明確になり、再利用性も向上しています。

タイプ「Generic Handler」のプロジェクトに新しいアイテムを追加します。これにより、新しい.ashxファイルが作成されます。 IHttpHandlerを実装するクラスのメインメソッドはProcessRequestです。したがって、元の質問のコードを使用するには:

public void ProcessRequest (HttpContext context) {

    if(String.IsNullOrEmpty(context.Request["day"]))
    {
        context.Response.End(); 
    }

    string json = "";
    byte[] bytes = getByteArray();

    json = JsonConvert.SerializeObject(bytes);
    context.Response.ContentType = "text/json";
    context.Response.Write(json);
}

AJAX呼び出しのURLを変更すると、それが実行されます。JavaScriptは次のようになります。ここでGetFileHandler.ashxは、作成したIHttpHandlerの名前です。

$.ajax(
    {
        type: "POST",
        async: true,
        url: 'Handlers/GetFileHandler.ashx',
        data: "Day=" + $.toJSON(day),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            console.log("SUCCESS:" + msg);
        },
        error: function (msg) {
            console.log("error:" + msg);
        }
    });

考慮すべきもう1つの小さな点として、ハンドラコード自体からSessionオブジェクトにアクセスする必要がある場合は、必ずIRequiresSessionStateインターフェースから継承してください。

public class GetFileHandler : IHttpHandler, IRequiresSessionState
35
Shai Cohen

はい、あなたのメソッドはWebMethod属性で静的でなければなりません

基本的な例:

CS

using System;
using System.Web.Services;

public partial class _Default : System.Web.UI.Page
{
  [WebMethod(EnableSession=false)]
  public static string HelloWorld()
  {
    return "Hello World";
  }
}

JavaScript

<script>
    $.ajax({
      type: "POST",
      url: "Default.aspx/HelloWorld",
      data: "{}",
      contentType: "application/json",
      dataType: "json",
      success: function(msg) {
        console.log(msg.d);
      }
    });
</script>
3
GerjanOnline

私はwebformで作業してからしばらく経ちましたが、正しく覚えていれば、webmethod属性をGetFileメソッドに置き、そのメソッドを静的にすれば機能するはずです。

 [WebMethod]
 public static string GetFile(string day)

さらに、ajaxメソッドでデータを投稿する方法は少しずれています。 URLからクエリ文字列の日を削除し、データは{"day":day}のようなjson形式である必要があります

1
Martin Larsson