Как вернуть объект JSON в стандартных веб-формах .Net - PullRequest
15 голосов
/ 10 ноября 2011

Цель состоит в том, чтобы вызвать метод, который делает это, затем возвращает объект 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)]

Ответы [ 3 ]

32 голосов
/ 10 ноября 2011

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

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

public class GetFileHandler : IHttpHandler, IRequiresSessionState
3 голосов
/ 10 ноября 2011

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

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

 [WebMethod]
 public static string GetFile(string day)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...