Как вернуть объект JSON в стандартные веб-формы .Net

Цель состоит в вызове метода, который делает это, затем возвращает объект JSON.

Я новичок в JSON.

У меня есть default.aspx и в нем следующий код. Теперь я хочу, чтобы обычный метод в Default.aspx.cs запускался на событие click здесь.

$(".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;
    }

Где я здесь ошибаюсь? Должен ли я каким-либо образом использовать это или использовать его только в веб-службах?

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

Ответ 1

Я бы предложил 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);
}

Измените URL-адрес в своем вызове AJAX, и он должен это сделать. 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);
        }
    });

Еще одна небольшая точка для рассмотрения, если вам нужен доступ к объекту Session из самого кода обработчика, убедитесь, что он наследуется от интерфейса IRequiresSessionState:

public class GetFileHandler : IHttpHandler, IRequiresSessionState

Ответ 2

Да, ваш метод должен быть статичным с атрибутом 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

Прошло некоторое время с тех пор, как я работал с веб-формами, но если правильно запомнить, он должен работать, если вы поместите атрибут webmethod поверх метода GetFile и сделаете этот метод статическим.

 [WebMethod]
 public static string GetFile(string day)

Кроме того, как вы отправляете данные в ajax-методе, это бит. Удалите день запроса с url, и данные должны быть в формате json, что-то вроде { "day": day}