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

#jquery #asp.net #ajax #json #webforms

#jquery #asp.net #ajax #json #веб-формы

Вопрос:

Цель состоит в том, чтобы вызвать метод, который выполняет свою задачу, а затем возвращает объект 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 . Нет жизненного цикла страницы (поэтому он выполняется очень быстро) и гораздо более чистое разделение кода, а также возможность повторного использования.

Добавьте в свой проект новый элемент типа «Универсальный обработчик». Это создаст новый файл .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);
        }
    });
  

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

 public class GetFileHandler : IHttpHandler, IRequiresSessionState
  

Комментарии:

1. Хорошо, мне нравится этот метод, но каким должен быть URL-адрес в вызове Ajax?

2. Я получаю: метод 405 не разрешен

3. На какой точный URL вы отправляете запрос? Я спрашиваю, потому что при поиске в Google было обнаружено следующее: Эта проблема возникает только при использовании Microsoft Internet Information Services (IIS) 4.0 и Microsoft Internet Information Services 5.0. Эта проблема возникает, если вы отправляете POST-запрос на сервер, на котором запущен IIS 4.0 или IIS 5.0, и POST-запрос содержит URL-адрес, заканчивающийся косой чертой (/). IIS возвращает сообщение об ошибке 405 вместо документа по умолчанию. Однако, если значением метода свойства Verb является GET или HEAD, IIS возвращает документ по умолчанию.

4. Тип носителя MIME для текста JSON является application/json . Кодировкой по умолчанию является UTF-8. (Источник: RFC 4627)

Ответ №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>
  

Комментарии:

1. Откуда берется d?

Ответ №3:

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

  [WebMethod]
 public static string GetFile(string day)
  

Кроме того, способ публикации данных в методе ajax немного отличается. Удалите строку запроса day из URL, и данные должны быть в формате json, что-то вроде {«day»:day}